Problem polega na tym, że kiedy wywołuję window.close()
lub self.close()
nie zamyka okna. Teraz wydaje się, że w Chrome nie można zamknąć skryptem żadnego okna, które nie zostało utworzone przez skrypt. Jest to ewidentnie fałszywe, ale mimo wszystko ma to nadal robić, nawet jeśli wymaga pojawienia się ostrzeżenia w celu potwierdzenia. To się nie dzieje.
Czy więc ktoś ma prawdziwą, funkcjonalną i sprawdzoną metodę zamykania okna za pomocą czegoś podobnego javascript:window.close()
lub javascript:self.close()
faktycznie robi to, czego się oczekuje i coś, co dzieje się dobrze w każdej przeglądarce, która NIE jest oparta na Chrome? Wszelkie sugestie byłyby bardzo mile widziane i szukam rozwiązania specyficznego dla Javascript, nic JQuery lub implementacja strony trzeciej.
Aktualizacja: Chociaż wiele z tego, co zostało zasugerowane, ma poważne ograniczenia i problemy z użytecznością, najnowsza sugestia (specyficzna dla TamperMonkey) dotycząca użycia // @grant window.close
w nagłówku skryptu często załatwia sprawę nawet na tych kartach, które zwykle nie radzą sobie z metodą close. Chociaż nie jest do końca idealny i nie uogólniany na każdy przypadek, w moim przypadku jest dobrym rozwiązaniem.
window.close()
działa dla mnie w chrome.window.close
nie działa tak, jak powinien, myślę, że może to być bardziej pomocne niż powiedzenie „to nie działa”.<a href="javascript:window.close">CLOSE</a>
Odpowiedzi:
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 dla
window.close()
: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 :
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 obecniepodatny na exploit „samodzielnego przekierowania”. Tak więc kod taki działał ogólnie: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 prostegowindow.close()
. NA PRZYKŁAD: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.
źródło
dom.allow_scripts_to_close_windows;false
siętrue
, ale nic w Chrome odgadnąć bez włamania źródło / rebuild czyli jak mam wokół niego teraz. Wiem i rozmawiałem z deweloperem TM, aw ostatniej wersji alfa / beta umieściliśmy ją jako opcję kompatybilności (ustawienie skryptu), aby działała w stylu man-in-the-middle. Chyba poza hackami nie mamy czystego rozwiązania, szkoda.window.close()
będzie działać w Tampermonkey, jeśli ustawisz@grant
wartość inną niżnone
. Zobacz ten wątek .Chrome Naprawiono problemy bezpieczeństwa w wersji 36.0.1985.125
Chrome 36.0.1985.125 ŚRODA, 16 LIPCA 2014 Informacje o wersji
Z moich obserwacji wynika, że ta aktualizacja rozwiązała problem z używaniem
window.close()
do zamykania wyskakującego okienka. Zobaczysz to w konsoli, gdy się nie powiedzie, „Skrypty mogą zamykać tylko te okna, które zostały przez niego otwarte”. Oznacza to, że hacky obejścia (odpowiedź Brocka Adamsa) mogą nie działać w najnowszej wersji.Tak więc w poprzednich wydanych kompilacjach Chrome poniższy blok kodu mógł działać, ale nie w przypadku tej aktualizacji.
W przypadku tej aktualizacji musisz odpowiednio zaktualizować kod, aby zamknąć wyskakujące okienko. Jednym z rozwiązań jest pobranie identyfikatora wyskakującego okna i użycie
metoda, aby go usunąć. Interfejs API systemu Windows dla rozszerzenia Chrome można znaleźć pod adresem chrome.windows .
Właściwie moje rozszerzenie Chrome, MarkView, miało ten problem i musiałem zaktualizować kod, aby działał w tej aktualizacji Chrome. Nawiasem mówiąc, MarkView jest narzędziem do odczytu i zapisu niesamowitych plików Markdown, zapewnia funkcje, w tym kontur zawartości, sortowalne tabele i podświetlanie składni bloku kodu z numerem wiersza.
Stworzyłem również ten post , wszelkie komentarze są mile widziane.
źródło
open(location, '_self').close();
- zwróć uwagę na użycie wartości zwracanej zopen()
. To nadal działa w Chrome36.0.1985.125 m
open(location, '_self').close();
, otrzymałem błąd „Unauthorized”. Ten błąd jest inny z 'window.close ()(warning on this"Scripts may close only the windows that were opened by it."). It looked like
open (location,' _self '). Close (); `przesunięto trochę do przodu, ale w moim przypadku nie można go zakończyć. Dzięki @ brock-adams za komentarz.chrome.windows.remove
to umieściłem , mówi, że nie mogę znaleźć chromowanego symbolu. jak mogę to rozwiązać? czy muszę dodać jakieś odniesienie?W tampermonkey możesz teraz użyć
A potem po prostu zadzwoń
źródło
Używam metody opublikowanej przez Brocka Adamsa i działa ona nawet w przeglądarce Firefox, jeśli jest inicjowana przez użytkownika.
Wywołuję go za pomocą przycisku, więc jest inicjowany przez użytkownika i nadal działa dobrze, używając przeglądarki Chrome 35-40, Internet Explorer 11, Safari 7-8 i RÓWNIEŻ Firefox 29-35. Testowałem przy użyciu wersji 8.1 systemu Windows i Mac OS X 10.6, 10.9 i 10.10, jeśli jest inaczej.
Kod samozamykającego się okna (na stronie, która się zamyka)
Kompletny kod używany w oknie otwartym przez użytkownika, które może się zamknąć:
window_to_close.htm
JavaScript:
HTML:
Wypróbuj tę stronę testową: (teraz testowana w Chrome 40 i Firefox 35)
http://browserstrangeness.bitbucket.io/window_close_tester.htm
Kod otwieracza okna (na stronie, która otwiera powyższą stronę)
Aby to zadziałało, narzucona przez zabezpieczenia zgodność z różnymi przeglądarkami wymaga, aby okno, które ma zostać zamknięte, zostało już otwarte przez użytkownika klikającego przycisk w tej samej domenie witryny.
Na przykład okno, które używa powyższej metody do zamykania się, można otworzyć ze strony przy użyciu tego kodu (kod dostarczony z mojej przykładowej strony, do której link powyżej):
window_close_tester.htm
JavaScript:
HTML:
źródło
<button onclick="open(location,'_self').close()" >Close Window</button>
. Czy robię coś ewidentnie nie tak? Wydaje mi się, że jest to również inicjowane przez użytkownika. Zwróć uwagę, że uzyskam ten sam wynik, jeśli użyję a<button>
lub<input type="button">
.window.open('', '_self', ''); window.close();
ale działałoopen(location, '_self').close();
Wiele osób wciąż próbuje znaleźć sposób na zamknięcie przeglądarki Chrome za pomocą javascript. Poniższa metoda działa tylko wtedy, gdy używasz Chrome jako programu uruchamiającego aplikacje - na przykład kiosk!
Przetestowałem następujące elementy:
Używam następującego rozszerzenia: Zamknij Kiosk
Postępuję zgodnie z instrukcjami użytkowania i wydaje się, że działa dobrze (upewnij się, że wyczyściłeś pamięć podręczną podczas wykonywania testów). Używam javascript (dołączonego do zdarzenia kliknięcia):
Mam nadzieję, że to komuś pomoże, bo to jedyne działające rozwiązanie, jakie znalazłem.
Uwaga: wygląda na to, że rozszerzenie działa w tle i dodaje ikonę paska Chrome. Ma zaznaczoną opcję: „Pozwól Chrome działać w tle” (lub podobny tekst). Być może będziesz musiał się nim bawić, dopóki nie zadziała. Odznacziłem to i teraz działa dobrze!
źródło
Pomimo myślenia, że jest to „ewidentnie fałszywe”, to, co mówisz „wydaje się być przekonaniem”, jest w rzeczywistości poprawne. Dokumentacja Mozilli dla window.close mówi
Mówisz, że ma „nadal to robić”, ale nie sądzę, abyś znalazł jakieś odniesienie, które by to potwierdzało, może źle coś zapamiętałeś?
źródło
Znalazłem nowy sposób, który doskonale mi pasuje
źródło
Poniższy kod zadziałał dla mnie -
Przetestowano na Chrome 43.0.2357.81
źródło
To może być stare, ale odpowiedzmy na to.
Używam top.close (), aby zamknąć kartę. window.close () lub inne open ... close nie działa dla mnie.
źródło
"Scripts may not close windows that were not opened by script."
problem wspomniany w innych odpowiedziach.W moim przypadku strona musiała zostać zamknięta, ale mogła zostać otwarta przez łącze, a zatem
window.close
zakończyła się niepowodzeniem.Rozwiązaniem, które wybrałem, jest wydanie
window.close
, powindow.setTimeout
którym następuje przekierowanie na inną stronę.W ten sposób, jeśli się
window.close
powiedzie, wykonanie na tej stronie zostanie zatrzymane, ale jeśli się nie powiedzie, w ciągu sekundy przekieruje na inną stronę.źródło
Ta odpowiedź od Brocka sprawdziła się dla mnie. javascript nie może mieć możliwości zamknięcia okna, które nie zostało otwarte przez ten sam skrypt javascript.
Mogę zamknąć okno potomne tylko wtedy, gdy będę je zamykać z javascript nadrzędnego. więc w moim rodzicu mogę zrobić coś takiego.
źródło
Możesz także spróbować użyć mojego kodu poniżej. Pomoże Ci to również w przekierowaniu okna nadrzędnego:
Rodzic:
Popup:
źródło
W przypadku TamperMonkey:
Ref: https://www.tampermonkey.net/documentation.php#_grant
źródło
Tylko jeśli otworzysz nowe okno za pomocą window.open (), nowe okno będzie mogło zostać zamknięte za pomocą kodu, jak wspomniałem powyżej. U mnie to działa idealnie :) Uwaga: Nigdy nie używaj href do otwierania strony w nowej karcie. Window.close () nie działa z „href”. Zamiast tego użyj window.open ().
źródło
Chciałem podzielić się moim „rozwiązaniem” w tej kwestii. Wygląda na to, że większość z nas próbuje zamknąć okno przeglądarki podczas standardowej sesji przeglądarki, kiedy użytkownik odwiedza jakąś witrynę internetową po odwiedzeniu innych witryn, a zanim odwiedzą kolejne.
Jednak moja sytuacja jest taka, że tworzę aplikację internetową dla urządzenia, które będzie zasadniczo jedyną rzeczą, jaką robi to urządzenie. Uruchamiasz go, uruchamia Chrome i przechodzi do naszej aplikacji. Nie jest nawet połączony z Internetem, wszystkie serwery, z którymi rozmawia, znajdują się w naszych lokalnych kontenerach Docker. Użytkownik potrzebuje sposobu na zamknięcie aplikacji (czyli zamknięcie przeglądarki Chrome), aby uzyskać dostęp do terminala w celu wykonania aktualizacji systemu.
Więc się uruchamia, uruchamia Chrome w trybie kiosku, już pod właściwym adresem. Dzieje się tak, aby łatwo spełnić drugą opcję w specyfikacji:
Więc po prostu dzwonienie
window.close()
z mojej aplikacji kiosku po prostu działa !źródło
Spróbuj czegoś takiego onclick = "return self.close ()"
źródło