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.close
im 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.
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.
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.
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 einstellenallow_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.
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.
In Tampermonkey können Sie jetzt verwenden
// @grant window.close
Und dann einfach anrufen
window.close();
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
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!
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?
Ich habe einen neuen Weg gefunden, der für mich perfekt funktioniert
var win = window.open("about:blank", "_self");
win.close();
Der folgende Code hat für mich funktioniert -
window.open('location', '_self', '');
window.close();
Getestet auf Chrome 43.0.2357.81
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.
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);