Обычный javascript не может закрывать окна волей-неволей. Это функция безопасности, представленная некоторое время назад, для предотвращения различных злонамеренных эксплойтов и неприятностей.
Из последней рабочей спецификации дляwindow.close()
:
close()
Метод на Window объекты должны, если все следующие условия, близко контекст просмотра :
- Соответствующий контекст просмотра A является закрываемым сценарием .
- Контекстное просмотр действующего сценария знаком с контекстным просмотра A .
- Просмотра контекста сценария действующего разрешено перемещаться контекстным просмотр A .
Контекст просмотра может быть закрыт сценарием, если он является вспомогательным контекстом просмотра, созданным сценарием (в отличие от действий пользователя), или если это контекст просмотра, история сеанса которого содержит только один Документ.
Это означает, что за одним небольшим исключением нельзя разрешать 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()
. НАПРИМЕР:
// ==UserScript==
// @name window.close demo
// @include http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant GM_addStyle
// ==/UserScript==
setTimeout (window.close, 5000);
Спасибо zanetu за обновление. Обратите внимание, что это не будет работать, если открыта только одна вкладка. Закрывает только дополнительные вкладки.
Fire Fox защищен от этой атаки. Таким образом, единственный способ javascript - нанести вред настройкам безопасности, по одному браузеру за раз.
Вы можете открыть about:config
и установить
allow_scripts_to_close_windows
на true
.
Если ваш сценарий предназначен для личного использования, сделайте это. Если вы попросите кого-нибудь еще включить эту настройку, он будет разумным и оправданным отказаться с предубеждением.
Там в настоящее время нет эквивалентной настройки для Chrome.
window.close()
у меня работает в хроме.