Window.close и self.close не закрывают окно в Chrome.

Проблема заключается в том, что при вызове window.close() или self.close() он не закрывает окно. Теперь, похоже, существует убеждение, что в Chrome вы не можете закрыть script любое окно, которое не создано script. Это явно ложно, но, несмотря на то, что он все еще должен это делать, даже если для этого требуется всплывающее предупреждение. Это не происходит.

У кого-нибудь есть реальный, функциональный и проверенный метод закрытия окна с использованием чего-то вроде javascript:window.close() или javascript:self.close(), который фактически делает то, что ожидается, и что-то, что происходит просто отлично в каждом браузере, который НЕ основан на Chrome? Любые предложения были бы очень благодарны, и я ищу Javascript-специфическое решение, ничего JQuery или стороннюю реализацию.

Обновление: В то время как значительная часть предложенных предложений имеет серьезные ограничения и проблемы с удобством использования, последнее предложение (специфичное для TamperMonkey) с использованием // @grant window.close в script заголовок часто выполняет трюк даже на тех вкладках, которые обычно не могут обрабатывать метод close. Хотя это не совсем идеальное и не обобщенно для каждого случая, это хорошее решение в моем случае.

Ответ 1

Обычный javascript не может закрывать окна волей-неволей. Это функция безопасности, введенная некоторое время назад, чтобы остановить различные злонамеренные действия и раздражения.

Из последняя рабочая спецификация для window.close():

Метод close() для объектов Window должен, если выполняются все следующие условия, закройте контекст просмотра A:

  • Соответствующий контекст просмотра A script -closable.
  • Контекст просмотра действующего script знаком с контекстом просмотра A.
  • В контексте просмотра существующего script разрешено перемещаться по контексту просмотра A.

Контекст просмотра script -closable, если он является вспомогательным контекстом просмотра, который был создан script (в отличие от действия пользователя), или если он контекст просмотра, история сеанса которого содержит только один документ.

Это означает, что с одним небольшим исключением javascript не должен закрывать окно, которое не было открыто этим же javascript.

Chrome позволяет это исключение, которое оно не применяется к пользовательским скриптам, однако Firefox этого не делает. Исключительные состояния реализации Firefox:

Этот метод разрешен только для окон, открытых с помощью script с помощью метода 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 script; Greasemonkey и Tampermonkey могли бы разумно предоставить эту функциональность в своем API (по сути, упаковывая работу по расширению для вас).
Рассмотрите возможность создания запроса функции.



Хакерные обходные пути:

Chrome в настоящее время уязвим для эксплойта "self redirection". Так что код, подобный этому, использовался в целом:

open(location, '_self').close();

Это ошибочное поведение, ИМО, и теперь (примерно в апреле 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.

Если ваш script предназначен для личного использования, продолжайте и делайте это. Если вы попросите кого-нибудь еще включить эту настройку, они будут умны и оправданы, чтобы отказаться от предрассудков.

В настоящее время для Chrome нет эквивалентных настроек.

Ответ 2

Chrome Исправлены проблемы с безопасностью на версии 36.0.1985.125

Chrome 36.0.1985.125 СРЕДА, 16 ИЮЛЯ, 2014 Замечание о выпуске

Из моего наблюдения это обновление устранило проблему при использовании window.close(), чтобы закрыть всплывающее окно. Вы увидите это на консоли, когда оно не получится: "Скрипты могут закрывать только открытые им окна". Это означает Хакерные обходные пути (ответ Брок Адамса) может не работать в последней версии.

Таким образом, в предыдущих выпусках выпущенных выпусков Chrome, блок кода ниже может работать, но не с этим обновлением.

window.open('', '_self', '');
window.close();

Для этого обновления вам необходимо обновить свой код, чтобы закрыть всплывающее окно. Одним из решений является захват идентификатора всплывающего окна и использование

chrome.windows.remove(integer windowId, function callback)

чтобы удалить его. API расширений расширения Chrome можно найти в chrome.windows.

На самом деле мое расширение chrome MarkView столкнулось с этой проблемой, и мне пришлось обновить свой код, чтобы он работал для этого обновления Chrome. Кстати, MarkView - это инструмент для чтения и записи Awesome Markdown Files, он предоставляет функции, включая Content Outline, Sortable Tables и подсветку синтаксиса блока кода с номером строки.

Я также создал этот пост, любые комментарии приветствуются.

Ответ 3

В tampermonkey теперь вы можете использовать

// @grant        window.close

А затем просто вызовите

window.close();

Ответ 4

Я использую метод, опубликованный Броком Адамсом, и он даже работает в 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 & 10.10, если это не так.


Самозакрывающийся код окна (на закрывающейся странице)

Полный код для использования в открытом пользователем окне, которое может закрыться:

JavaScript:

function quitBox(cmd)
{   
    if (cmd=='quit')
    {
        open(location, '_self').close();
    }   
    return false;   
}

HTML:

<input type="button" name="Quit" id="Quit" value="Quit" onclick="return quitBox('quit');" />

Попробуйте эту тестовую страницу: (сейчас тестируется в Chrome 40 и Firefox 35)

http://browserstrangeness.bitbucket.io/window_close_tester.htm


  Код открывателя окна (на странице, которая открывает вышеуказанную страницу)

Чтобы это работало, кросс-браузерная совместимость с обеспечением безопасности требует, чтобы закрываемое окно уже было открыто пользователем, нажимающим кнопку в том же домене сайта.

Например, окно, которое использует описанный выше метод для закрытия самого себя, может быть открыто со страницы с помощью этого кода (код предоставлен с моей страницы-примера, ссылки на которую приведены выше):

JavaScript:

function open_a_window() 
{
    window.open("window_to_close.htm"); 

    return false;
}

HTML:

<input type="button" onclick="return open_a_window();" value="Open New Window/Tab" />

Ответ 5

Многие люди все еще пытаются найти способ закрыть браузер Chrome с помощью javascript. Следующий метод работает только при использовании Chrome в качестве запуска APP - киоск, например!

Я протестировал следующее:

Я использую следующее расширение: Закрыть киоск

Я следую инструкциям по использованию и, кажется, работает очень хорошо (убедитесь, что вы очищаете кеш при выполнении тестов). Используемый javascript (прикрепленный к событию клика):

window.location.href = '/closekiosk';

Я надеюсь, что это поможет кому-то, поскольку это единственное работающее решение, которое я нашел.

Примечание. Кажется, что расширение работает в фоновом режиме и добавляет значок в Chrome. Он имеет следующий флажок: "Пусть Chrome работает в фоновом режиме" (или аналогичный текст). Возможно, вам придется играть с ним, пока он не сработает для вас. Я снял флажок, и теперь все работает отлично!

Ответ 6

Несмотря на то, что это "явно ложно", то, что вы говорите "кажется верой", на самом деле правильное. Документация Mozilla для window.close говорит

Этот метод разрешен только для окон, открытых с помощью script с помощью метода window.open. Если окно не было открыто с помощью script, в консоли JavaScript появляется следующая ошибка: скрипты могут не закрывать окна, которые не были открыты с помощью script

Вы говорите, что он "должен все еще делать это", но я не думаю, что вы найдете какую-либо ссылку, которая поддерживает это, возможно, вы что-то забыли?

Ответ 7

Я нашел новый способ, который отлично работает для меня

var win = window.open("about:blank", "_self");
win.close();

Ответ 8

Следующий код работал у меня -

window.open('location', '_self', '');
window.close();

Протестировано на Chrome 43.0.2357.81

Ответ 9

Это может быть старым, но ответьте на него.

Я использую top.close(), чтобы закрыть вкладку. window.close() или другое открытое... close не работает для меня.

Ответ 10

В моем случае страницу нужно было закрыть, но, возможно, она была открыта по ссылке, и, таким образом, window.close потерпит неудачу.

Решение, которое я выбрал, заключается в выпуске window.close, за которым следует window.setTimeout, который перенаправляет на другую страницу.

Таким образом, если window.close завершается успешно, выполнение на этой странице останавливается, но если происходит сбой, через секунду он перенаправляет на другую страницу.

window.close();
window.setTimeout(function(){location.href = '/some-page.php';},1000);

Ответ 11

Только если вы откроете новое окно с помощью window.open(), новое окно сможет закрыть код, как я упомянул выше. Это отлично работает для меня:) Примечание. Никогда не используйте href для открытия страницы на новой вкладке. Window.close() не работает с "href". Вместо этого используйте window.open().

Ответ 12

Попробуйте что-то подобное onclick = "return self.close()"