Проблема в том, что когда я вызываю window.close()
или self.close()
, окно не закрывается. Сейчас существует мнение, что в Chrome нельзя закрыть скриптом любое окно, не созданное скриптом. Это вопиюще неверно, но независимо от этого предполагается, что он все равно сделает это, даже если для этого потребуется вывести на экран предупреждение для подтверждения. Этого не происходит.
Так есть ли у кого-нибудь реальный, функциональный и проверенный метод закрытия окна с помощью чего-то вроде javascript:window.close()
или javascript:self.close()
, который действительно делает то, что ожидается, и то, что происходит просто отлично в каждом браузере, который НЕ основан на Chrome? Любые предложения были бы очень признательны, и я ищу решение для Javascript, ничего JQuery или сторонней реализации.
Обновление: Хотя многое из того, что было предложено, имеет серьезные ограничения и проблемы с удобством использования, последнее предложение (специфичное для TamperMonkey) с использованием // @grant window.close
в заголовке скрипта часто делает трюк даже на тех вкладках, которые обычно не могут обработать метод закрытия. Хотя это не совсем идеально и не подходит для всех случаев, в моем случае это хорошее решение.
Обычный javascript не может произвольно закрывать окна. Это функция безопасности, введенная некоторое время назад для предотвращения различных вредоносных эксплойтов и раздражающих факторов.
Из последней рабочей спецификации для window.close()
:
Метод
close()
для объектов Window должен, если выполняются все следующие условия, закрыть контекст просмотра A:
- Соответствующий контекст просмотра A является script-closable.
- Контекст просмотра действующего скрипта знаком с контекстом просмотра 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 в настоящее время был уязвим для эксплойта "self redirection". Поэтому код, подобный этому, раньше работал в целом:
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 нет аналогичной настройки.
Хром 36.0.1985.125 среда, 16 июля 2014 года Обратите внимание
Из моих наблюдений, в этом обновлении Исправлена проблема с использованием окна.закрыть ()`, чтобы закрыть всплывающее окно. Вы увидите это в консоли, когда это удастся, то "скрипты могут закрыть только окна, которые были открыты его.и". Что означает в "сокс" обходные пути (Брок Адамс'ы ответ) не может работать в последнем выпуске.
Так, в предыдущем хром строит, указанных ниже блок кода может работал, но не в этом обновлении.
window.open('', '_self', '');
window.close();
Для этого обновления, вы должны обновить ваш код таким образом, чтобы закрыть всплывающее окно. Одним из решений является, чтобы захватить всплывающее окошко для удостоверения личности и использовать
chrome.windows.remove(integer windowId, function callback)
метод, чтобы удалить его. Расширение Chrome для Windows API можно найти в хром.окна.
На самом деле мое расширение для Chrome MarkView сталкивается с этим вопросом и мне пришлось обновить мой код, чтобы сделать его работу для этого обновления хрома. Кстати, MarkView-это инструмент для чтения и записи высокий файлы уценке, она обеспечивает функции, включая план содержания, сортируемых таблицах и блок кода с подсветкой синтаксиса и номер строки.
Я также создал этот пост, любые комментарии приветствуются.
Я использую метод, опубликованный Броком Адамсом, и он даже работает в 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, если это отличается.
Код самозакрывающегося окна (на странице, которая закрывается сама)
Полный код для использования в окне, открытом пользователем, которое может закрываться самостоятельно:
window_to_close.htm.
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
Код открывателя окна (на странице, которая открывает вышеуказанную страницу).
Чтобы это работало, кросс-браузерная совместимость, навязанная безопасностью, требует, чтобы закрываемое окно уже было открыто пользователем, нажавшим на кнопку в том же домене сайта.
Например, окно, которое закрывается с помощью описанного выше метода, может быть открыто со страницы, использующей этот код (код взят из моего примера страницы, ссылка на которую приведена выше):
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" />
Многие люди до сих пор пытаются найти способ, чтобы закрыть браузер Chrome на JavaScript. Следующий метод работает только при использовании Chrome как приложения Launcher - киоск например!
Я испытал следующее:
Я'м, используя следующие расширения: закрыть киоск
Я'м после инструкция по применению и, кажется, работает просто отлично (убедитесь, что вы очистить кэш во время выполнения тестов). В JavaScript я использую (прилагается к событию click):
window.location.href = '/closekiosk';
Я надеюсь, что это помогает кто-то, как он'ы единственное рабочее решение я нашел.
Примечание: кажется, что расширение работает в фоновом режиме и добавляет иконку в трее хром. Он имеет следующие опции: "Давайте Крома работать в фоновом режиме" и (или аналогичный текст). Возможно, вам придется играть с ним, пока он работает для вас. Я бесконтрольно его и теперь он работает просто отлично!
Несмотря на то, что вы считаете это "откровенно ложным", то, что вы говорите "похоже на убеждение", на самом деле верно. В документации Mozilla для window.close говорится, что
Этот метод разрешено вызывать только для окон, которые были открыты скриптом с помощью метода window.open. Если окно не было открыто сценарием, в консоли JavaScript появляется следующая ошибка: Сценарии не могут закрывать окна, которые не были открыты сценарием
Вы говорите, что "предполагается, что он все еще делает это", но я не думаю, что вы найдете какую-либо ссылку, которая подтверждает это, может быть, вы что-то неправильно запомнили?
Я нашел новый способ, который работает для меня perfetly
var win = window.open("about:blank", "_self");
win.close();
Приведенный ниже код работал для меня
window.open('location', '_self', '');
window.close();
Проверено на Хром 43.0.2357.81
В моем случае, страницу нужно закрыть, но может быть открыт по ссылке, и таким образом, окно`.закрыть бы ошибкой.
Решение я выбрал, чтобы оформить окно.закрыть, сопровождаемый
окна.функции setTimeout`, который перенаправляет на другую страницу.
Таким образом, если окно.закрыть` успешно выполняется, выполнения на этой странице останавливается, но если это не удается, во втором, он будет перенаправлять на другую страницу.
window.close();
window.setTimeout(function(){location.href = '/some-page.php';},1000);
Только если открыть новое окно через окно.открыть() будет новое окно можно было закрыть с помощью кода, как я уже упоминал выше. Это работает прекрасно для меня :) внимание : никогда не используйте href для открытия страницы в новой вкладке. Окна.закрыть() не работает с "слишком" по . Окна использовать.открыть() вместо этого.