Il javascript ordinario non può chiudere Windows volenti o nolenti. Questa è una funzione di sicurezza, introdotta qualche tempo fa, per fermare vari exploit e fastidi dannosi.
Dalle ultime specifiche di lavoro perwindow.close()
:
Il close()
metodo sugli oggetti Window dovrebbe, se sono soddisfatte tutte le seguenti condizioni, chiudere il contesto di navigazione A :
- Il contesto di navigazione A corrispondente è chiudibile con script .
- Il contesto di navigazione dello script in carica abbia familiarità con il contesto di navigazione A .
- Il contesto navigazione dello script in carica è permesso di navigare il contesto di navigazione A .
Un contesto di esplorazione può essere chiuso da script se si tratta di un contesto di esplorazione ausiliario creato da uno script (al contrario di un'azione dell'utente) o se si tratta di un contesto di esplorazione la cui cronologia delle sessioni contiene solo un documento.
Ciò significa che, con una piccola eccezione, javascript non deve poter chiudere una finestra che non è stata aperta dallo stesso javascript.
Chrome consente quell'eccezione, che non si applica agli script utente, tuttavia Firefox no. L'implementazione di Firefox flat out afferma :
Questo metodo può essere chiamato solo per le finestre che sono state aperte da uno script usando il window.open
metodo.
Se provi ad usare window.close
un Greasemonkey / Tampermonkey / userscript otterrai:
Firefox: il messaggio di errore " Scripts may not close windows that were not opened by script.
"
Chrome: fallisce silenziosamente.
La soluzione a lungo termine:
Il modo migliore per gestirlo è invece creare un'estensione Chrome e / o un componente aggiuntivo per Firefox. Questi possono chiudere in modo affidabile la finestra corrente.
Tuttavia, poiché i rischi per la sicurezza, posti da window.close
, sono molto meno per uno script Greasemonkey / Tampermonkey; Greasemonkey e Tampermonkey potrebbero ragionevolmente fornire questa funzionalità nella loro API (essenzialmente comprimendo il lavoro dell'estensione per te).
Valuta di fare una richiesta di funzionalità.
Le soluzioni alternative hacky:
Chrome è attualmente vulnerabile all'exploit di "auto-reindirizzamento". Quindi un codice come questo funzionava in generale:
open(location, '_self').close();
Si tratta di un comportamento errato, IMO, ed è ora (a partire da circa aprile 2015) per lo più bloccato. Funzionerà comunque dal codice iniettato solo se la scheda è appena aperta e non ha pagine nella cronologia di navigazione. Quindi è utile solo in una serie molto piccola di circostanze.
Tuttavia, una variante funziona ancora su Chrome (v43 e v44) più Tampermonkey (v3.11 o successive) . Usa un esplicito @grant
e chiaro window.close()
. PER ESEMPIO:
// ==UserScript==
// @name window.close demo
// @include http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant GM_addStyle
// ==/UserScript==
setTimeout (window.close, 5000);
Grazie a zanetu per l'aggiornamento. Si noti che questo non funzionerà se è aperta una sola scheda. Chiude solo le schede aggiuntive.
Firefox è sicuro contro quell'exploit. Quindi, l'unico modo javascript è quello di paralizzare le impostazioni di sicurezza, un browser alla volta.
È possibile aprire about:config
e impostare
allow_scripts_to_close_windows
su true
.
Se la tua sceneggiatura è per uso personale, vai avanti e fallo. Se chiedi a qualcun altro di attivare tale impostazione, sarebbe intelligente e giustificato rifiutare con pregiudizio.
Al momento non esiste un'impostazione equivalente per Chrome.
window.close()
funziona per me in Chrome.