Звичайний javascript не може закрити вільно-невільно. Це функція безпеки, запроваджена деякий час тому, щоб зупинити різні шкідливі подвиги та роздратування.
З останньої робочої характеристики дляwindow.close()
:
close()
Метод на Window об'єкти повинні, якщо всі наступні умови, близько контекст перегляду :
- Відповідний контекст перегляду A доступний для скриптів .
- Контекст перегляду поточного сценарію знайомий з контекстом A перегляду .
- Перегляду контексту сценарію чинного дозволено переміщатися контекстним перегляд A .
Контекст перегляду доступний для скриптів, якщо це допоміжний контекст перегляду, створений сценарієм (на відміну від дії користувача), або якщо це контекст перегляду, історія сеансів містить лише один документ.
Це означає, що за одним невеликим винятком, JavaScript не повинен дозволяти закривати вікно, яке не було відкрито тим самим JavaScript.
Chrome допускає цей виняток - який не застосовується до сценаріїв користувачів - однак Firefox цього не робить. У програмі реалізації Firefox викладено :
Цей метод дозволяється викликати лише для Windows, які були відкриті скриптом за допомогою window.open
методу.
Якщо ви спробуєте скористатись window.close
Greasemonkey / Tampermonkey / usercript, ви отримаєте:
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 немає еквівалентних налаштувань.
window.close()
працює для мене в хромі.