Das Problem ist, dass wenn ich window.close()
oder self.close()
aufrufe, das Fenster nicht geschlossen wird. Nun scheint es den Glauben zu geben, dass man in Chrome kein Fenster per Script schließen kann, das nicht per Script erstellt wurde. Das ist offenkundig falsch, aber es soll trotzdem funktionieren, auch wenn eine Meldung zur Bestätigung erscheinen muss. Dies ist nicht der Fall.
Also hat jemand echte, funktionale und bewährte Methode zum Schließen eines Fensters mit so etwas wie javascript:window.close()
oder javascript:self.close()
, die tatsächlich tut, was erwartet wird und etwas, das passiert einfach gut in jedem Browser, der nicht Chrome-basiert ist? Jede Anregung wäre sehr geschätzt, und ich bin auf der Suche nach Javascript spezifische Lösung, nichts JQuery oder Drittanbieter-Implementierung.
Aktualisierung: Während vieles von dem, was vorgeschlagen wurde, schwerwiegende Einschränkungen und Probleme mit der Benutzerfreundlichkeit hat, funktioniert der letzte Vorschlag (speziell für TamperMonkey) mit // @grant window.close
im Skript-Header oft sogar bei Tabs, die normalerweise nicht mit der Schließmethode umgehen können. Das ist zwar nicht ganz ideal und lässt sich nicht auf jeden Fall verallgemeinern, aber in meinem Fall ist es eine gute Lösung.
Gewöhnliches Javascript kann Fenster nicht einfach so schließen. Dies ist eine Sicherheitsfunktion, die vor einiger Zeit eingeführt wurde, um verschiedene bösartige Angriffe und Belästigungen zu verhindern.
Aus der letzten Arbeitsspezifikation für window.close()
:
Die Methode close()
für Window-Objekte sollte, wenn alle folgenden Bedingungen erfüllt sind, den Browsing-Kontext A schließen:
- Der entsprechende Browsing-Kontext A ist script-closable.
- Der Browsing-Kontext des amtierenden Skripts ist mit dem Browsing-Kontext A vertraut.
- Der Browsing-Kontext des etablierten Skripts darf in dem Browsing-Kontext A navigieren.
Ein Browsing-Kontext ist script-closable, wenn es sich um einen Hilfsbrowsing-Kontext handelt, der durch ein Skript (im Gegensatz zu einer Aktion des Benutzers) erstellt wurde, oder wenn es sich um einen Browsing-Kontext handelt, dessen Sitzungsverlauf nur ein Dokument enthält.
Dies bedeutet, mit einer kleinen Ausnahme, dass Javascript nicht erlaubt sein darf, ein Fenster zu schließen, das nicht von demselben Javascript geöffnet wurde.
Chrome erlaubt diese Ausnahme - die es nicht auf Benutzerskripte anwendet - aber Firefox nicht. Die Firefox-Implementierung sagt ganz klar:
Diese Methode darf nur für Fenster aufgerufen werden, die von einem Skript mit der Methode window.open
geöffnet wurden.
Wenn Sie versuchen, window.close
von einem Greasemonkey / Tampermonkey / Userskript aus zu benutzen, erhalten Sie:
Firefox: Die Fehlermeldung, "Scripts may not close windows that were not opened by script.
"
Chrome: schlägt einfach stillschweigend fehl.
Die beste Lösung ist es, eine Chrome-Erweiterung und/oder ein Firefox-Add-on zu erstellen, die das aktuelle Fenster zuverlässig schließen können.
Da jedoch die Sicherheitsrisiken, die von window.close
ausgehen, für ein Greasemonkey/Tampermonkey-Skript viel geringer sind, könnten Greasemonkey und Tampermonkey diese Funktionalität vernünftigerweise in ihrer API bereitstellen (im Wesentlichen die Arbeit der Erweiterung für Sie verpacken).
Denken Sie darüber nach, eine Funktionsanfrage zu stellen.
Chrome ist derzeit war anfällig für den "self redirection" Exploit. Code wie dieser hat also im Allgemeinen funktioniert:
open(location, '_self').close();
Dies ist IMO ein fehlerhaftes Verhalten und ist nun (seit etwa April 2015) größtenteils blockiert. Es funktioniert immer noch mit eingefügtem Code nur wenn der Tab frisch geöffnet ist und keine Seiten im Browserverlauf hat. Es ist also nur unter sehr wenigen Umständen nützlich.
Eine Variante funktioniert jedoch noch mit Chrome (v43 & v44) und Tampermonkey (v3.11 oder später). Verwenden Sie ein explizites @grant
und einfaches window.close()
. EG:
// ==UserScript==
// @name window.close demo
// @include http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant GM_addStyle
// ==/UserScript==
setTimeout (window.close, 5000);
Dank an zanetu für die Aktualisierung. Beachten Sie, dass dies nicht funktioniert, wenn nur eine Registerkarte geöffnet ist. Es werden nur zusätzliche Tabs geschlossen.
Firefox ist gegen diesen Exploit sicher. Die einzige Möglichkeit, die Javascript bietet, besteht also darin, die Sicherheitseinstellungen eines Browsers nach dem anderen auszuhebeln.
Sie können about:config
öffnen und einstellen
allow_scripts_to_close_windowsauf
true` setzen.
Wenn Ihr Skript für den persönlichen Gebrauch bestimmt ist, können Sie das ruhig tun. Wenn Sie jemand anderen bitten, diese Einstellung zu aktivieren, wäre es klug und gerechtfertigt, sie mit Vorurteilen abzulehnen.
Für Chrome gibt es derzeit keine entsprechende Einstellung.
Ich benutze die Methode, die von Brock Adams gepostet wird und es funktioniert sogar in Firefox, wenn es vom Benutzer initiiert wird.
open(location, '_self').close();
Ich rufe es über einen Tastendruck auf, so dass es benutzerinitiiert ist, und es funktioniert immer noch gut mit Chrome 35-40, Internet Explorer 11, Safari 7-8 und auch Firefox 29-35. Ich habe mit Version 8.1 von Windows und Mac OS X 10.6, 10.9 & 10.10 getestet, falls das anders ist.
Self-Closing Window Code (auf der Seite, die sich selbst schließt)
Der vollständige Code für das vom Benutzer geöffnete Fenster, das sich selbst schließen kann:
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');" />
Probieren Sie diese Testseite aus: (Jetzt getestet in Chrome 40 und Firefox 35)
http://browserstrangeness.bitbucket.io/window_close_tester.htm
Fensteröffner-Code (auf einer Seite, die die oben genannte Seite öffnet)
Damit dies funktioniert, muss das Fenster, das geschlossen werden soll, aus Sicherheitsgründen bereits durch Anklicken einer Schaltfläche innerhalb derselben Website-Domäne geöffnet worden sein.
Das Fenster, das sich mit der obigen Methode selbst schließt, kann z. B. von einer Seite mit diesem Code geöffnet werden (der Code stammt von meiner oben verlinkten Beispielseite):
window_close_tester.htm
Javascripte:
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" />
Obwohl ich es für "offensichtlich falsch" halte, ist das, was Sie sagen "scheint ein Glaube zu sein", tatsächlich richtig. In der Mozilla-Dokumentation für window.close steht
" Diese Methode darf nur für Fenster aufgerufen werden, die von einem Skript mit der Methode window.open geöffnet wurden. Wurde das Fenster nicht durch ein Skript geöffnet, erscheint in der JavaScript-Konsole folgende Fehlermeldung: Skripte dürfen keine Fenster schließen, die nicht durch ein Skript geöffnet wurden
Sie sagen, dass es "immer noch tun soll", aber ich glaube nicht, dass Sie irgendeine Referenz finden, die das unterstützt, vielleicht haben Sie sich an etwas falsch erinnert?