Поскольку они являются объектно-ориентированными глобальными переменными, вы можете обычно создавать свои классы таким образом, чтобы они вам не нужны.
Теперь в tampermonkey вы можете использовать
// @grant window.close
, а затем просто назовите
window.close();
Обычный javascript не может закрыть окна волей-неволей. Это функция безопасности, введенная некоторое время назад, чтобы остановить различные вредоносные эксплойты и раздражения.
Из последней рабочей спецификации для window.close()
:
Метод
close()
для объектов Window должен, если выполняются все следующие условия, закройте контекст просмотра A :
- Соответствующий контекст просмотра [ является script-closable .
- Контекст просмотра действующего сценария знаком с контекстом просмотра A .
- В контексте просмотра действующего сценария разрешено перемещаться по контексту просмотра A .
Контекст просмотра - script-closable , если это вспомогательный контекст просмотра, который был создан сценарием (в отличие от действия пользователя), или если это контекст просмотра, в истории сеанса которого содержится только один документ.
Это означает, что с одним небольшим исключением javascript не должен закрывать окно, которое не было написанный тем же javascript.
Chrome разрешает это исключение, которое не применяется к пользовательским скриптам, однако Firefox этого не делает. Исключительные состояния реализации Firefox. :
Этот метод разрешен только для окон, открытых скриптом с использованием метода
window.open
.
Если вы попытаетесь использовать
window.close
из Greasemonkey / Tampermonkey / userscript, вы получите: Firefox: сообщение об ошибке, «Scripts may not close windows that were not opened by script.
» Chrome: просто молча.
Долгосрочное решение:
Лучший способ справиться с этим - это сделать расширение Chrome и / или дополнение Firefox. Они могут достоверно закрыть текущее окно.
Однако, поскольку риски безопасности, создаваемые
window.close
, намного меньше для сценария Greasemonkey / Tampermonkey; Greasemonkey и Tampermonkey могли бы разумно предоставить эту функциональность в своем API (по сути, упаковывая работу по расширению для вас). Рассмотрите возможность создания запроса функции.
Хакерные обходные пути:
В настоящее время Chrome уязвим для эксплойта «самоперехвата». Так что код, подобный этому, использовался для работы в целом:
open(location, '_self').close();
Это ошибочное поведение, IMO, и теперь (примерно в апреле 2015 года) блокируется в основном. Он все равно будет работать с , введенным кодом только , если вкладка только что открыта и не имеет страниц в истории просмотра. Так что это полезно только при очень небольшом наборе обстоятельств.
Тем не менее, вариант по-прежнему работает на Chrome (v43 и v44) плюс Tampermonkey (v3.11 или новее). Используйте явные
@grant
и обычныеwindow.close()
. EG:// ==UserScript== // @name window.close demo // @include http://YOUR_SERVER.COM/YOUR_PATH/* // @grant GM_addStyle // ==/UserScript== setTimeout (window.close, 5000);
Благодаря zanetu для обновления. Обратите внимание, что это не сработает, если открыта только одна вкладка. Он закрывает дополнительные вкладки.
Firefox защищен от этого эксплойта. Таким образом, единственным способом javascript является повреждение настроек безопасности, по одному браузеру за раз.
Вы можете открыть
about:config
и установитьallow_scripts_to_close_windows
наtrue
.Если ваш сценарий предназначен для личного использования, продолжайте и делайте это. Если вы попросите кого-нибудь еще включить эту настройку, они будут умны и оправданы, чтобы отказаться от предрассудков.
В настоящее время для Chrome нет эквивалентных настроек.
dom.allow_scripts_to_close_windows;false
на true
, но я ничего не думаю об этом в Chrome, не взломав исходный / перестроенный, так как теперь я обходил его. Я знаю и говорил с разработчиком TM, и в недавней альфа-бетах мы поставили его как вариант совместимости (настройка скрипта) для работы в стиле «человек в середине». Я догадываюсь, что у нас нет чистого решения, жалость.
– GµårÐïåñ
5 November 2013 в 02:13
window.close()
будет работать в Tampermonkey, если вы установите @grant
на значение, отличное от none
. См. эту нить .
– zanetu
27 August 2015 в 20:59
Только если вы откроете новое окно, используя window.open (), новое окно сможет закрыть код, как я уже упоминал выше. Это отлично работает для меня :) Примечание. Никогда не используйте href для открытия страницы на новой вкладке. Window.close () не работает с «href». Вместо этого используйте window.open ().
Несмотря на то, что это «явно ложно», то, что вы говорите «кажется верой», на самом деле является правильным. Документация Mozilla для window.close говорит
Этот метод разрешен только для окон, открытых скриптом с использованием метода window.open. Если окно не было открыто сценарием, в консоли JavaScript появляется следующая ошибка: скрипты могут не закрывать окна, которые не были открыты скриптом
. Вы говорите, что оно «должно оставаться сделайте это », но я не думаю, что вы найдете какую-либо ссылку, которая поддерживает это, может быть, вы что-то забыли?
Я использую метод, опубликованный Brock Adams, и он даже работает в Firefox, если он инициирован пользователем.
open(location, '_self').close();
Я вызываю его нажатием на кнопку, поэтому он инициируется пользователем, и это все еще работает отлично, используя Chrome 35-40, Internet Explorer 11, Safari 7-8 и ALSO Firefox 29-35. Я тестировал версию 8.1 Windows и Mac OS X 10.6, 10.9 и amp; 10.10 если это другое.
Полный код:
HTML:
<input type="button" name="Quit" id="Quit" value="Quit" onclick="return quitBox('quit');" />
JavaScript:
function quitBox(cmd)
{
if (cmd=='quit')
{
open(location, '_self').close();
}
return false;
}
Попробуйте следующую тестовую страницу: (Теперь протестировано в Chrome 40 и Firefox 35)
http://browserstrangeness.bitbucket.io/window_close_tester.htm
<button onclick="open(location,'_self').close()" >Close Window</button>
. Я делаю что-то явно неправильно? Мне кажется, что это тоже пользователь. Обратите внимание, что я получаю тот же результат, если я использую <button>
или <input type="button">
.
– LordOfThePigs
28 August 2014 в 23:47
Многие люди все еще пытаются найти способ закрыть браузер Chrome с помощью javascript. Следующий метод работает только тогда, когда вы используете Chrome в качестве запуска APP - киоск, например!
Я протестировал следующее:
Я использую следующее расширение: Закрыть киоск
Я следую инструкциям по использованию и, кажется, работает очень хорошо (убедитесь, что вы очищаете кеш при выполнении тестов). Используемый javascript (прикрепленный к событию клика):
window.location.href = '/closekiosk';
Надеюсь, что это поможет кому-то, поскольку это единственное работающее решение, которое я нашел.
Примечание. расширение работает в фоновом режиме и добавляет значок в Chrome. Он имеет следующий флажок: «Пусть Chrome работает в фоновом режиме» (или аналогичный текст). Возможно, вам придется играть с ним, пока он не сработает для вас. Я снял флажок, и теперь все работает отлично!
Попробуйте что-то подобное onclick = "return self.close ()"
Это может быть старым, но давайте ответим на это.
Я использую top.close (), чтобы закрыть вкладку. window.close () или другое открытое ... close не работает для меня.
"Scripts may not close windows that were not opened by script."
, упомянутой в других ответах.
– kad81
15 September 2014 в 07:49
Код ниже работал для меня -
window.open('location', '_self', '');
window.close();
Проверено на Chrome 43.0.2357.81
Chrome 36.0.1985.125 СРЕДА, 16 ИЮЛЯ 2014 Примечание к выпуску
Из моего наблюдения, это обновление устранило проблему при использовании window.close()
, чтобы закрыть всплывающее окно. Вы увидите это на консоли, когда оно не получится: «Скрипты могут закрывать только открытые им окна». Это означает, что хакерские обходные пути (ответ Брок Адамса) могут не работать в последней версии.
Таким образом, в предыдущих выпусках, выпущенных Chrome, приведенный ниже блок кода может работать, но не с этим обновлением.
window.open('', '_self', '');
window.close();
Для этого обновления вам необходимо обновить свой код, чтобы закрыть всплывающее окно. Одним из решений является захват идентификатора всплывающего окна и использование метода
chrome.windows.remove(integer windowId, function callback)
для его удаления. API расширений Chrome API можно найти на странице chrome.windows .
На самом деле мое расширение chrome MarkView столкнулось с этой проблемой, и мне пришлось обновить свой код, чтобы он работал для этого обновления Chrome. Кстати, MarkView - это инструмент для чтения и записи Awesome Markdown Files, он предоставляет функции, включая Content Outline, Sortable Tables и подсветку синтаксиса блока кода с номером строки.
Я также создал этот пост , любые комментарии приветствуются.
open(location, '_self').close();
- обратите внимание на использование возвращаемого значения из open()
. Это все еще работает на Chrome 36.0.1985.125 m
– Brock Adams
21 July 2014 в 01:26
open(location, '_self').close();
, я получил «Несанкционированный». ошибка на этом. Эта ошибка отличается от «window.close () (warning on this"Scripts may close only the windows that were opened by it."). It looked like
open (location,« _self »). Close ();` немного продвинулся вперед, но в моем случае он не может завершиться. Спасибо @ brock-adams за комментарий.
– swcool
21 July 2014 в 16:42
chrome.windows.remove
, он говорит, что не мог найти символ хром. как я могу это решить? мне нужно добавить какую-то ссылку?
– DevT
22 July 2014 в 13:03
Я нашел новый способ, который отлично работает для меня
var win = window.open("about:blank", "_self");
win.close();