Das Problem ist, dass wenn ich aufrufe window.close()
oder self.close()
es das Fenster nicht schließt. Nun scheint es eine Überzeugung zu geben, dass Sie in Chrome kein Fenster schließen können, das nicht per Skript erstellt wurde. Das ist offensichtlich falsch, aber unabhängig davon, ob es dies dennoch tun soll, selbst wenn zur Bestätigung eine Warnung angezeigt werden muss. Diese passieren nicht.
So hat jemand wirklich, funktionale und bewährtes Verfahren zur Herstellung ein Fenster zu schließen etwas mit wie javascript:window.close()
oder javascript:self.close()
dass tatsächlich tut , was erwartet wird , und etwas , das ganz gut in jedem Browser geschieht , das Chrome basiert nicht? Alle Vorschläge würden sehr geschätzt und ich suche nach Javascript-spezifischer Lösung, nichts JQuery oder Implementierung durch Dritte.
Update: Während vieles, was vorgeschlagen wurde, schwerwiegende Einschränkungen und Usability-Probleme aufweist, reicht der neueste Vorschlag (speziell für TamperMonkey), der // @grant window.close
im Skript-Header verwendet wird, häufig auch auf Registerkarten aus, die normalerweise nicht mit der Methode close umgehen können. Obwohl es nicht ganz ideal ist und nicht auf jeden Fall verallgemeinert wird, ist es in meinem Fall eine gute Lösung.
window.close()
arbeitet für mich in Chrom.window.close
es nicht so funktioniert, wie es sollte, kann dies hilfreicher sein, als zu sagen: "Es funktioniert nicht".<a href="javascript:window.close">CLOSE</a>
Antworten:
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ür
window.close()
: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 :
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
derzeitanfällig für den Exploit "Selbstumleitung". Code wie dieser funktionierte also im Allgemeinen: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 einfachewindow.close()
. Z.B: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 einstellenallow_scripts_to_close_windows
auftrue
.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.
quelle
dom.allow_scripts_to_close_windows;false
,true
aber ich denke nichts in Chrome, ohne die Quelle zu hacken / neu zu erstellen, so habe ich es vorerst umgangen . Ich kenne und habe mit dem TM-Entwickler gesprochen und in der jüngsten Alpha / Beta-Version haben wir es als Kompatibilitätsoption (Einstellung des Skripts) eingeführt, um im Man-in-the-Middle-Stil ausgeführt zu werden. Ich denke, kurz vor den Hacks haben wir keine saubere Lösung, schade.window.close()
funktioniert in Tampermonkey, wenn Sie@grant
einen anderen Wert als festlegennone
. Siehe diesen Thread .Chrome Die Sicherheitsprobleme in Version 36.0.1985.125 wurden behoben
Chrome 36.0.1985.125 MITTWOCH, 16. Juli 2014 Freigabevermerk
Meiner Beobachtung nach hat dieses Update das Problem beim
window.close()
Schließen des Popup-Fensters behoben . Sie sehen dies in der Konsole, wenn es fehlschlägt: "Skripte schließen möglicherweise nur die Fenster, die von ihr geöffnet wurden." Das bedeutet, dass die hackigen Problemumgehungen (Brock Adams 'Antwort) in der neuesten Version möglicherweise nicht funktionieren .In den vorherigen von Chrome veröffentlichten Builds hat der folgende Codeblock möglicherweise funktioniert, jedoch nicht mit diesem Update.
Für dieses Update müssen Sie Ihren Code entsprechend aktualisieren, um das Popup-Fenster zu schließen. Eine der Lösungen besteht darin, die Popup-Fenster-ID abzurufen und zu verwenden
Methode, um es zu entfernen. Die Chrome-Erweiterungsfenster-API finden Sie unter chrome.windows .
Tatsächlich war meine Chrome-Erweiterung MarkView mit diesem Problem konfrontiert und ich musste meinen Code aktualisieren, damit er für dieses Chrome-Update funktioniert. MarkView ist übrigens ein Tool zum Lesen und Schreiben von Awesome Markdown-Dateien. Es bietet Funktionen wie Inhaltsübersicht, sortierbare Tabellen und Codeblock-Syntax-Highlight mit Zeilennummer.
Ich habe auch diesen Beitrag erstellt , Kommentare sind willkommen.
quelle
open(location, '_self').close();
- beachten Sie die Verwendung des Rückgabewerts vonopen()
. Dies funktioniert immer noch auf Chrome36.0.1985.125 m
open(location, '_self').close();
, ich habe den Fehler "Nicht autorisiert" erhalten. Dieser Fehler ist anders bei 'window.close ()(warning on this"Scripts may close only the windows that were opened by it."). It looked like
open (location,' _self '). Close (); `ist ein wenig vorwärts gegangen, kann aber in meinem Fall nicht abgeschlossen werden. Danke @ brock-adams für den Kommentar.chrome.windows.remove
es sage, heißt es, dass ich kein Symbolchrom finden konnte. Wie kann ich das beheben? Muss ich eine Referenz hinzufügen?In Tampermonkey können Sie jetzt verwenden
Und dann einfach anrufen
quelle
Ich verwende die von Brock Adams veröffentlichte Methode und sie funktioniert sogar in Firefox, wenn sie vom Benutzer initiiert wurde.
Ich rufe es per Tastendruck auf, damit es vom Benutzer initiiert wird , und es funktioniert immer noch einwandfrei 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 und 10.10 getestet, ob dies anders ist.
Code des selbstschließenden Fensters (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:
HTML:
Probieren Sie diese Testseite aus: (Jetzt in Chrome 40 und Firefox 35 getestet)
http://browserstrangeness.bitbucket.io/window_close_tester.htm
Fensteröffnercode (auf einer Seite, die die obige Seite öffnet)
Damit dies funktioniert, erfordert die sicherheitsübergreifende Cross-Browser-Kompatibilität, dass das zu schließende Fenster bereits vom Benutzer geöffnet wurde, der auf eine Schaltfläche innerhalb derselben Site-Domain klickt.
Zum Beispiel kann das Fenster, das die obige Methode verwendet, um sich selbst zu schließen, von einer Seite mit diesem Code geöffnet werden (Code von meiner oben verlinkten Beispielseite):
window_close_tester.htm
JavaScript:
HTML:
quelle
<button onclick="open(location,'_self').close()" >Close Window</button>
. Mache ich etwas offensichtlich falsch? Es scheint mir, dass dies auch vom Benutzer initiiert wird. Beachten Sie, dass ich das gleiche Ergebnis erhalte, wenn ich ein<button>
oder ein verwende<input type="button">
.window.open('', '_self', ''); window.close();
aber es funktionierte mitopen(location, '_self').close();
Viele Leute versuchen immer noch, den Chrome-Browser mit Javascript zu schließen. Die folgende Methode funktioniert nur, wenn Sie Chrome als APP-Launcher verwenden - zum Beispiel Kiosk!
Ich habe folgendes getestet:
Ich verwende die folgende Erweiterung: Kiosk schließen
Ich folge den Gebrauchsanweisungen und es scheint gut zu funktionieren (stellen Sie sicher, dass Sie den Cache leeren, während Sie die Tests durchführen). Das von mir verwendete Javascript ist (an das Klickereignis angehängt):
Ich hoffe, das hilft jemandem, da es die einzige funktionierende Lösung ist, die ich gefunden habe.
Hinweis: Die Erweiterung wird anscheinend im Hintergrund ausgeführt und fügt ein Chrome-Taskleistensymbol hinzu. Die folgende Option ist aktiviert: "Chrome im Hintergrund laufen lassen" (oder ähnlicher Text). Möglicherweise müssen Sie damit spielen, bis es für Sie funktioniert. Ich habe es deaktiviert und jetzt funktioniert es einwandfrei!
quelle
Obwohl Sie denken, es sei "offensichtlich falsch", ist das, was Sie sagen "scheint ein Glaube zu sein", tatsächlich richtig. In der Mozilla-Dokumentation für window.close heißt es
Sie sagen, dass es "es immer noch tun soll", aber ich glaube nicht, dass Sie eine Referenz finden werden, die dies unterstützt. Vielleicht haben Sie sich an etwas falsch erinnert?
quelle
Ich habe einen neuen Weg gefunden, der perfekt für mich funktioniert
quelle
Der folgende Code hat bei mir funktioniert -
Getestet auf Chrome 43.0.2357.81
quelle
Das mag alt sein, aber lassen Sie es uns beantworten.
Ich benutze top.close () , um einen Tab zu schließen. window.close () oder ein anderes Öffnen ... Schließen hat bei mir nicht funktioniert.
quelle
"Scripts may not close windows that were not opened by script."
in anderen Antworten erwähnten Problem.In meinem Fall musste die Seite geschlossen werden, wurde jedoch möglicherweise über einen Link geöffnet und
window.close
schlägt daher fehl.Die Lösung, die ich gewählt habe, ist die Ausgabe der
window.close
, gefolgt von einerwindow.setTimeout
, die auf eine andere Seite umleitet.Wenn dies
window.close
erfolgreich ist, wird die Ausführung auf dieser Seite gestoppt. Wenn dies jedoch fehlschlägt, wird sie in einer Sekunde auf eine andere Seite umgeleitet.quelle
Diese Antwort von Brock bringt es für mich zum Laufen. Javascript darf kein Fenster schließen, das nicht von demselben Javascript geöffnet wurde.
Ich kann das untergeordnete Fenster nur schließen, wenn ich es über das übergeordnete Javascript schließen werde. Also kann ich bei meinen Eltern so etwas tun.
quelle
Sie können auch versuchen, meinen Code unten zu verwenden. Dies hilft Ihnen auch dabei, Ihr übergeordnetes Fenster umzuleiten:
Elternteil:
Aufpoppen:
quelle
Für TamperMonkey:
Ref: https://www.tampermonkey.net/documentation.php#_grant
quelle
Nur wenn Sie ein neues Fenster mit window.open () öffnen, kann das neue Fenster mit Code geschlossen werden, wie oben erwähnt. Dies funktioniert perfekt für mich :) Hinweis: Verwenden Sie niemals href, um die Seite in einem neuen Tab zu öffnen. Window.close () funktioniert nicht mit "href". Verwenden Sie stattdessen window.open ().
quelle
Ich wollte meine "Lösung" mit diesem Problem teilen. Es scheint, als würden die meisten von uns versuchen, ein Browserfenster in einer Standardbrowsersitzung zu schließen, in der ein Benutzer die eine oder andere Website besucht, nachdem er andere Websites besucht hat und bevor er weitere besucht.
Meine Situation ist jedoch, dass ich eine Web-App für ein Gerät erstelle, die im Wesentlichen das einzige ist, was das Gerät tut. Sie starten es, es startet Chrome und navigiert zu unserer App. Es ist nicht einmal mit dem Internet verbunden, alle Server, mit denen es spricht, befinden sich in unseren lokalen Docker-Containern. Der Benutzer benötigt eine Möglichkeit, die App zu schließen (auch bekannt als Chrome schließen), damit er auf das Terminal zugreifen kann, um Systemaktualisierungen durchzuführen.
Also bootet es, startet Chrome im Kiosk-Modus, bereits an der richtigen Adresse. Dies erfüllt leicht die zweite Option in der Spezifikation:
Es funktioniert also einfach, einfach
window.close()
von meiner Kiosk-App aus anzurufen !quelle
Versuchen Sie so etwas onclick = "return self.close ()"
quelle