Zwykły javascript nie może zamknąć systemu Windows chcąc nie chcąc. Jest to funkcja bezpieczeństwa, wprowadzona jakiś czas temu, aby powstrzymać różne złośliwe exploity i irytacje.
Z najnowszej specyfikacji roboczej dlawindow.close()
:
close()
Metoda na okno obiekty powinny, jeśli spełnione są wszystkie poniższe warunki, blisko kontekst przeglądania :
- Odpowiedni kontekst przeglądania A jest zamykany przez skrypt .
- Kontekst przeglądanie urzędującego skryptu jest zaznajomiony z kontekstu przeglądania A .
- Przeglądanie kontekst skryptu zasiedziałego może poruszać się kontekstowe przeglądania A .
Kontekst przeglądania jest zamykany przez skrypt, jeśli jest to pomocniczy kontekst przeglądania, który został utworzony przez skrypt (w przeciwieństwie do działania użytkownika) lub jeśli jest to kontekst przeglądania, którego historia sesji zawiera tylko jeden dokument.
Oznacza to, że z jednym małym wyjątkiem javascript nie może zamknąć okna, które nie zostało otwarte przez ten sam skrypt javascript.
Chrome dopuszcza ten wyjątek - którego nie ma w przypadku skryptów użytkownika - jednak Firefox tego nie robi. Implementacja Firefoksa jasno stwierdza :
Tę metodę można wywołać tylko w przypadku okien, które zostały otwarte przez skrypt korzystający z tej window.open
metody.
Jeśli spróbujesz użyć window.close
skryptu Greasemonkey / Tampermonkey / userscript, otrzymasz:
Firefox: komunikat o błędzie „ Scripts may not close windows that were not opened by script.
”
Chrome: po prostu nie działa.
Długoterminowe rozwiązanie:
Najlepszym sposobem radzenia sobie z tym problemem jest utworzenie rozszerzenia do Chrome i / lub dodatku do przeglądarki Firefox. Mogą one niezawodnie zamknąć bieżące okno.
Jednakże, ponieważ zagrożenia bezpieczeństwa, jakie stwarza window.close
, są znacznie mniejsze w przypadku skryptu Greasemonkey / Tampermonkey; Greasemonkey i Tampermonkey mogą rozsądnie zapewnić tę funkcjonalność w swoim API (zasadniczo pakując rozszerzenie dla Ciebie).
Rozważ zgłoszenie prośby o funkcję.
Hacky obejścia:
Chrome jest obecnie podatny na exploit „samodzielnego przekierowania”. Tak więc kod taki działał ogólnie:
open(location, '_self').close();
To jest błędne zachowanie, IMO, i obecnie (mniej więcej od kwietnia 2015 r.) Jest w większości blokowane. Będzie działać po wstrzyknięciu kodu tylko wtedy, gdy karta jest świeżo otwarta i nie ma stron w historii przeglądania. Jest więc przydatny tylko w bardzo małych okolicznościach.
Jednak odmiana nadal działa w przeglądarce Chrome (wersja 43 i 44) oraz Tampermonkey (wersja 3.11 lub nowsza) . Użyj wyraźnego @grant
i prostego window.close()
. NA PRZYKŁAD:
// ==UserScript==
// @name window.close demo
// @include http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant GM_addStyle
// ==/UserScript==
setTimeout (window.close, 5000);
Dzięki zanetu za aktualizację. Zauważ, że to nie zadziała, jeśli jest otwarta tylko jedna karta. Zamyka tylko dodatkowe zakładki.
Firefox jest zabezpieczony przed tym exploitem. Tak więc jedynym sposobem javascript jest uszkodzenie ustawień bezpieczeństwa, jedna przeglądarka na raz.
Można otworzyć about:config
i ustawić
allow_scripts_to_close_windows
się true
.
Jeśli twój skrypt jest do użytku osobistego, zrób to. Jeśli poprosisz kogoś innego o włączenie tego ustawienia, mądry i uzasadniony będzie odmówienie z uprzedzeniem.
Obecnie nie ma odpowiednika ustawienia dla przeglądarki Chrome.
window.close()
działa dla mnie w chrome.