Gewöhnliches Javascript kann Fenster nicht ohne weiteres schließen. Dies ist eine Sicherheitsfunktion, die vor einiger Zeit eingeführt wurde, um verschiedene böswillige Exploits und Belästigungen zu stoppen.
Aus der neuesten Arbeitsspezifikation fürwindow.close()
:
Die close()
Methode für Fensterobjekte sollte, wenn alle folgenden Bedingungen erfüllt sind, den Browserkontext A schließen :
- Der entsprechende Browser - Kontext A ist Skript verschließbar .
- Der Browserkontext des etablierten Skripts ist mit dem Browserkontext A vertraut .
- Der Browserkontext des etablierten Skripts darf im Browserkontext A navigieren .
Ein Browser - Kontext ist Skript verschließbare wenn es ein Hilfs Browsing Kontext ist , die durch ein Skript erstellt wurde (wie durch eine Aktion des Benutzers im Gegensatz zu), oder wenn es sich um einen Browser - Kontext , dessen Sitzungsverlaufes enthält nur ein Dokument.
Dies bedeutet, dass Javascript mit einer kleinen Ausnahme kein Fenster schließen darf, das nicht von demselben Javascript geöffnet wurde.
Chrome lässt diese Ausnahme zu, die nicht für Benutzerskripte gilt, Firefox jedoch nicht. In der Firefox-Implementierung heißt es :
Diese Methode darf nur für Fenster aufgerufen werden, die von einem Skript mit der window.open
Methode geöffnet wurden .
Wenn Sie versuchen, window.close
ein Greasemonkey / Tampermonkey / Userscript zu verwenden, erhalten Sie Folgendes:
Firefox: Die Fehlermeldung " Scripts may not close windows that were not opened by script.
"
Chrome: schlägt nur stillschweigend fehl.
Die langfristige Lösung:
Der beste Weg, um damit umzugehen, besteht darin , stattdessen eine Chrome-Erweiterung und / oder ein Firefox-Add-On zu erstellen. Diese können das aktuelle Fenster zuverlässig schließen.
Da die Sicherheitsrisiken window.close
für ein Greasemonkey / Tampermonkey-Skript jedoch viel geringer sind; Greasemonkey und Tampermonkey könnten diese Funktionalität in ihrer API vernünftigerweise bereitstellen (im Wesentlichen die Erweiterungsarbeit für Sie verpacken).
Erwägen Sie, eine Funktionsanforderung zu stellen.
Die hackigen Problemumgehungen:
Chrome war derzeit anfällig für den Exploit "Selbstumleitung". Code wie dieser funktionierte also im Allgemeinen:
open(location, '_self').close();
Dies ist ein fehlerhaftes Verhalten, IMO, und ist jetzt (ab ungefähr April 2015) größtenteils blockiert. Es funktioniert nur dann mit injiziertem Code , wenn die Registerkarte neu geöffnet wurde und keine Seiten im Browserverlauf enthalten sind. Es ist also nur unter sehr kleinen Umständen nützlich.
Eine Variante funktioniert jedoch weiterhin unter Chrome (v43 & v44) plus Tampermonkey (v3.11 oder höher) . Verwenden Sie eine explizite @grant
und einfache window.close()
. Z.B:
// ==UserScript==
// @name window.close demo
// @include http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant GM_addStyle
// ==/UserScript==
setTimeout (window.close, 5000);
Danke an zanetu für das Update. Beachten Sie, dass dies nicht funktioniert, wenn nur eine Registerkarte geöffnet ist. Es werden nur zusätzliche Registerkarten geschlossen.
Firefox ist gegen diesen Exploit sicher. Die einzige Möglichkeit, Javascript zu verwenden, besteht darin, die Sicherheitseinstellungen Browser für Browser zu lähmen.
Sie können öffnen about:config
und einstellen
allow_scripts_to_close_windows
auf true
.
Wenn Ihr Skript für den persönlichen Gebrauch bestimmt ist, machen Sie das. Wenn Sie jemanden bitten, diese Einstellung zu aktivieren, wäre er klug und gerechtfertigt, mit Vorurteilen abzulehnen.
Derzeit gibt es keine entsprechende Einstellung für Chrome.
window.close()
arbeitet für mich in Chrom.