Le javascript ordinaire ne peut pas fermer les fenêtres bon gré mal gré. Il s'agit d'une fonctionnalité de sécurité, introduite il y a quelque temps, pour arrêter divers exploits et ennuis malveillants.
De la dernière spécification de travail pourwindow.close()
:
La close()
méthode sur les objets Window doit, si toutes les conditions suivantes sont remplies, fermer le contexte de navigation A :
- Le contexte de navigation A correspondant peut être fermé par script .
- Le contexte de navigation du script sortant connaît le contexte de navigation A .
- Le contexte de navigation du script historique est autorisé à naviguer dans le contexte de navigation A .
Un contexte de navigation peut être fermé par script s'il s'agit d'un contexte de navigation auxiliaire créé par un script (par opposition à une action de l'utilisateur), ou s'il s'agit d'un contexte de navigation dont l'historique de session ne contient qu'un seul document.
Cela signifie, à une petite exception près, que javascript ne doit pas être autorisé à fermer une fenêtre qui n'a pas été ouverte par ce même javascript.
Chrome autorise cette exception - qui ne s'applique pas aux scripts utilisateur - mais pas Firefox. L'implémentation de Firefox déclare :
Cette méthode ne peut être appelée que pour les fenêtres ouvertes par un script utilisant la window.open
méthode.
Si vous essayez d'utiliser à window.close
partir d'un Greasemonkey / Tampermonkey / userscript, vous obtiendrez:
Firefox: Le message d'erreur " Scripts may not close windows that were not opened by script.
"
Chrome: échoue silencieusement.
La solution à long terme:
La meilleure façon de gérer cela est de créer une extension Chrome et / ou un module complémentaire Firefox. Ceux-ci peuvent fermer de manière fiable la fenêtre actuelle.
Cependant, puisque les risques de sécurité, posés par window.close
, sont bien moindres pour un script Greasemonkey / Tampermonkey; Greasemonkey et Tampermonkey pourraient raisonnablement fournir cette fonctionnalité dans leur API (essentiellement le travail d'extension pour vous).
Pensez à faire une demande de fonctionnalité.
Les solutions de contournement hacky:
Chrome est actuellement vulnérable à l'exploit «d'auto-redirection». Donc, un code comme celui-ci fonctionnait en général:
open(location, '_self').close();
Il s'agit d'un comportement bogué, IMO, et est maintenant (à peu près en avril 2015) principalement bloqué. Cela fonctionnera toujours à partir du code injecté uniquement si l'onglet est fraîchement ouvert et n'a pas de pages dans l'historique de navigation. Ce n'est donc utile que dans un très petit ensemble de circonstances.
Cependant, une variante fonctionne toujours sur Chrome (v43 et v44) plus Tampermonkey (v3.11 ou version ultérieure) . Utilisez un explicite @grant
et simple window.close()
. PAR EXEMPLE:
// ==UserScript==
// @name window.close demo
// @include http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant GM_addStyle
// ==/UserScript==
setTimeout (window.close, 5000);
Merci à zanetu pour la mise à jour. Notez que cela ne fonctionnera pas s'il n'y a qu'un seul onglet ouvert. Il ne ferme que les onglets supplémentaires.
Firefox est protégé contre cet exploit. Ainsi, le seul moyen javascript est de paralyser les paramètres de sécurité, un navigateur à la fois.
Vous pouvez ouvrir about:config
et définir
allow_scripts_to_close_windows
sur true
.
Si votre script est destiné à un usage personnel, allez-y et faites-le. Si vous demandez à quelqu'un d'autre d'activer ce paramètre, il serait intelligent et justifié de refuser avec préjugé.
Il n'existe actuellement aucun paramètre équivalent pour Chrome.
window.close()
fonctionne pour moi en chrome.