it-swarm.com.de

window.close und self.close schließen das Fenster in Chrome nicht

Das Problem ist, dass, wenn ich window.close() oder self.close() aufrufe, das Fenster nicht geschlossen wird. Es scheint nun der Glaube zu sein, dass Sie in Chrome kein Fenster schließen können, das nicht mit einem Skript erstellt wurde. Das ist offensichtlich falsch, aber unabhängig davon, dass es trotzdem getan werden soll, auch wenn zur Bestätigung eine Warnung angezeigt werden muss. Das passiert nicht.

Hat also jemand eine echte, funktionale und bewährte Methode zum Schließen eines Fensters mit etwas wie javascript:window.close() oder javascript:self.close(), das tatsächlich das tut, was erwartet wird, und was in jedem Browser passiert, der NICHT auf Chrome basiert? Alle Vorschläge wären sehr dankbar und ich suche nach Javascript-spezifischen Lösungen, nicht nach JQuery oder der Implementierung von Drittanbietern. 

Update: Während viele der Vorschläge gravierende Einschränkungen und Usability-Probleme aufweisen, wird der neueste Vorschlag (spezifisch für TamperMonkey) mit// @grant window.closeim Skript-Header oft sogar auf den Registerkarten ausgeführt, die normalerweise möglich sind nicht mit der close-Methode umgehen. Obwohl nicht ganz ideal und nicht auf jeden Fall verallgemeinert, ist es in meinem Fall eine gute Lösung.

141
GµårÐïåñ

Gewöhnliches Javascript kann Fenster nicht ohne weiteres schließen. Dies ist eine Sicherheitsfunktion, die vor einiger Zeit eingeführt wurde, um verschiedene bösartige Angriffe und Belästigungen zu verhindern.

Von der neuesten Arbeitsspezifikation für window.close() :

Die close()-Methode für Window-Objekte sollte den Suchkontext A schließen, wenn alle folgenden Bedingungen erfüllt sind:

  • Der entsprechende Browserkontext A ist Skript schließbar.
  • Der Browserkontext des vorhandenen Skripts ist mit dem Browserkontext A vertraut.
  • Der Browserkontext des vorhandenen Skripts darf im Browserkontext A navigieren.

Ein Browsing-Kontext ist script-closable, wenn es sich bei einem zusätzlichen Browsing-Kontext um handelt, das von einem Skript erstellt wurde (im Gegensatz zu einer Aktion des Benutzers), oder wenn es sich um einen Browsing-Kontext handelt, dessen Der Sitzungsverlauf enthält nur ein Dokument.

Das heißt, mit einer kleinen Ausnahme darf javascript ein Fenster nicht schließen, das nicht mit demselben Javascript geöffnet wurde.

Chrome lässt diese Ausnahme zu, die für Benutzerscripts nicht gilt, Firefox jedoch nicht. Die Firefox-Implementierung gibt an:

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 aus einem 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 im Hintergrund fehl.



Die langfristige Lösung:

Am besten damit umgehen, stattdessen eine Chrome-Erweiterung und/oder ein Firefox-Add-On erstellen. Diese können das aktuelle Fenster zuverlässig schließen.

Da jedoch die Sicherheitsrisiken von window.close für ein Greasemonkey/Tampermonkey-Skript wesentlich geringer sind; Greasemonkey und Tampermonkey könnten diese Funktionalität sinnvoll in ihrer API bereitstellen (im Wesentlichen die Erweiterungsarbeit für Sie packen).
Erwägen Sie eine Funktionsanforderung.



Die hackigen Workarounds:

Chrom ist gerade war anfällig für die "Selbstumleitung". Code wie dieser funktionierte normalerweise:

open(location, '_self').close();

Dies ist ein fehlerhaftes Verhalten, IMO, und ist jetzt (Stand ungefähr April 2015) größtenteils gesperrt. Es funktioniert weiterhin von injiziert code nur, wenn die Registerkarte frisch geöffnet ist und keine Seiten im Browserverlauf enthalten. Daher ist es nur in sehr wenigen Situationen nützlich.

Die Variante a funktioniert jedoch weiterhin auf Chrome (v43 & v44) und Tampermonkey (v3.11 oder höher). Verwenden Sie einen expliziten @grant und einfachen window.close(). Z.B:

// ==UserScript==
// @name        window.close demo
// @include     http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant       GM_addStyle
// ==/UserScript==

setTimeout (window.close, 5000);

Vielen Dank 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 vor diesem Exploit geschützt. Die einzige Möglichkeit, Javascript zu verwenden, besteht darin, die Sicherheitseinstellungen für jeden Browser zu verkrüppeln.

Sie können about:config öffnen und einstellen
allow_scripts_to_close_windows in true

Wenn Ihr Skript für den persönlichen Gebrauch bestimmt ist, machen Sie das weiter. Wenn Sie jemanden bitten, diese Einstellung zu aktivieren, wäre es klug und gerechtfertigt, mit Vorurteilen abzulehnen. 

Für Chrome gibt es derzeit keine entsprechende Einstellung.

158
Brock Adams

Chrome Die Sicherheitsprobleme in Version 36.0.1985.125 wurden behoben

Chrome 36.0.1985.125 MITTWOCH, 16. JULI 2014 Freigabemitteilung

Aus meiner Sicht behebt dieses Update das Problem bei der Verwendung von window.close() zum Schließen des Popup-Fensters. Sie sehen dies in der Konsole, wenn es fehlschlägt: "Skripts schließen möglicherweise nur die Fenster, die von ihr geöffnet wurden." Das bedeutet Die hackigen Workarounds (Antwort von Brock Adams) funktionieren möglicherweise nicht in der neuesten Version.

In den vorigen Chrome-Versionen konnte der folgende Codeblock jedoch funktionieren, jedoch nicht mit diesem Update.

window.open('', '_self', '');
window.close();

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 zu übernehmen und zu verwenden 

chrome.windows.remove(integer windowId, function callback)

methode, um es zu entfernen. Die Chrome-Erweiterungsfenster-API finden Sie unter chrome.windows

Eigentlich stand meine Chrome-Erweiterung MarkView vor diesem Problem, und ich musste meinen Code aktualisieren, damit er für dieses Chrome-Update funktioniert. MarkView ist übrigens ein Werkzeug zum Lesen und Schreiben von Awesome Markdown-Dateien. Es bietet Funktionen wie Inhaltsübersicht, sortierbare Tabellen und Hervorhebung der Codeblock-Syntax mit Zeilennummer.

Ich habe auch diesen Beitrag erstellt, alle Kommentare sind willkommen.

27
swcool

In Tampermonkey können Sie jetzt verwenden

// @grant        window.close

Und dann einfach anrufen

window.close();
16
balping

Ich verwende die von Brock Adams veröffentlichte Methode, und sie funktioniert sogar in Firefox, wenn sie vom Benutzer initiiert wird.

open(location, '_self').close();

Ich rufe es per Tastendruck an, also ist es vom Benutzer initiiert, und es funktioniert immer noch einwandfrei mit Chrome 35-40, Internet Explorer 11, Safari 7-8 und ALSO Firefox 29-35. Ich habe mit Version 8.1 von Windows und Mac OS X 10.6, 10.9 und 10.10 getestet, ob das anders ist. 


Der vollständige Code:

HTML:

<input type="button" name="Quit" id="Quit" value="Quit" onclick="return quitBox('quit');" />

JavaScript:

function quitBox(cmd)
{   
    if (cmd=='quit')
    {
        open(location, '_self').close();
    }   
    return false;   
}

Testen Sie diese Testseite: (Jetzt in Chrome 40 und Firefox 35 getestet) 

http://browserstrangeness.bitbucket.io/window_close_tester.htm

13
Jeff Clayton

Viele Leute versuchen immer noch, einen Weg zu finden, den Chrome-Browser mit Javascript zu schließen. Die folgende Methode funktioniert nur, wenn Sie Chrome als APP-Startprogramm verwenden - z. B. Kiosk!

Ich habe folgendes getestet:

Ich verwende die folgende Erweiterung: Close Kiosk

Ich befolge die Verwendungsanweisungen 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 Ereignis click angehängt):

window.location.href = '/closekiosk';

Ich hoffe, das hilft jemandem, da es die einzige funktionierende Lösung ist, die ich gefunden habe.

Hinweis: Die Erweiterung scheint im Hintergrund zu laufen und fügt ein Chrome-Tray-Symbol hinzu. Es ist die folgende Option aktiviert: "Chrome im Hintergrund ausführen" (oder ähnlichen Text). Möglicherweise müssen Sie damit spielen, bis es für Sie funktioniert. Ich habe es deaktiviert und jetzt funktioniert es gut!

9
Minister

Obwohl Sie denken, es sei "offensichtlich falsch", ist das, was Sie sagen, "scheinbar ein Glaube zu sein", tatsächlich richtig. Die Mozilla-Dokumentation für window.close sagt

Diese Methode darf nur für Fenster aufgerufen werden, die von einem Skript mit der Methode window.open geöffnet wurden. Wenn das Fenster nicht von einem Skript geöffnet wurde, wird in der JavaScript-Konsole der folgende Fehler angezeigt: Skripts schließen möglicherweise keine Fenster, die nicht von einem Skript geöffnet wurden

Sie sagen, dass es "soll es immer noch tun", aber ich glaube nicht, dass Sie irgendeinen Hinweis finden werden, der das unterstützt. Vielleicht haben Sie etwas falsch erlebt?

5
Gareth

Ich habe einen neuen Weg gefunden, der für mich perfekt funktioniert

var win = window.open("about:blank", "_self");
win.close();
5
Gerardo Abdo

Der folgende Code hat für mich funktioniert -

window.open('location', '_self', '');
window.close();

Getestet auf Chrome 43.0.2357.81

4
DfrDkn

Das mag alt sein, aber lasst es uns beantworten. 

Ich verwende top.close () , um einen Tab zu schließen. window.close () oder anderes Öffnen ... Schließen hat bei mir nicht funktioniert.

2
Soley

In meinem Fall musste die Seite geschlossen werden, wurde aber möglicherweise durch einen Link geöffnet und window.close würde daher fehlschlagen.

Die von mir gewählte Lösung besteht darin, den window.close auszugeben, gefolgt von einem window.setTimeout, der auf eine andere Seite umleitet.

Auf diese Weise wird die Ausführung auf dieser Seite angehalten, wenn window.close erfolgreich ist. Wenn dies fehlschlägt, wird die Seite auf eine andere Seite umgeleitet.

window.close();
window.setTimeout(function(){location.href = '/some-page.php';},1000);
0
user2182349