Le problème est que lorsque j'invoque window.close()
ou self.close()
, la fenêtre n'est pas fermée. Il semble qu'il y ait une croyance selon laquelle, dans Chrome, vous ne pouvez pas fermer par script une fenêtre qui n'est pas créée par un script. C'est manifestement faux, mais quoi qu'il en soit, il est censé le faire, même s'il doit afficher une alerte pour le confirmer. Ce n'est pas le cas.
Alors, est-ce que quelqu'un a une méthode réelle, fonctionnelle et éprouvée pour fermer une fenêtre en utilisant quelque chose comme javascript:window.close()
ou javascript:self.close()
qui fait réellement ce qui est attendu et quelque chose qui se passe très bien dans tous les navigateurs qui ne sont pas basés sur Chrome ? Toute suggestion serait grandement appréciée et je cherche une solution spécifique à Javascript, rien de JQuery ou d'implémentation d'un tiers.
Mise à jour: Bien que la plupart de ce qui a été suggéré présente de sérieuses limitations et des problèmes d'utilisation, la dernière suggestion (spécifique à TamperMonkey) utilisant // @grant window.close
dans l'en-tête du script fera souvent l'affaire même sur les onglets qui ne peuvent normalement pas gérer la méthode de fermeture. Bien que ce ne soit pas entièrement idéal et que cela ne soit pas généralisé à tous les cas, c'est une bonne solution dans mon cas.
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 un certain temps, pour empêcher divers exploits malveillants et désagréments.
Extrait de [la dernière spécification de travail pour window.close()
][1] :
La méthode
close()
sur les objets Window devrait, si toutes les conditions suivantes sont remplies, fermer le contexte de navigation A :
- Le contexte de navigation correspondant A est script-closable.
- Le contexte de navigation du script en place est familier avec le contexte de navigation A.
- Le contexte de navigation du script en place est autorisé à naviguer dans le contexte de navigation A.
Un contexte de navigation est script-closable s'il s'agit d'un contexte de navigation auxiliaire qui a été 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 le 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 - qu'il n'applique pas aux scripts utilisateur - mais pas Firefox. [L'implémentation de Firefox déclare carrément][2] :
Cette méthode ne peut être appelée que pour des fenêtres qui ont été ouvertes par un script utilisant la méthode
window.open
.
Si vous essayez d'utiliser window.close
à partir d'un script Greasemonkey / Tampermonkey / userscript vous obtiendrez :
Firefox: Le message d'erreur, "Scripts may not close windows that were not opened by script.
" ;
Chrome: échoue simplement en silence.
La meilleure façon de résoudre ce problème est de faire une extension Chrome et/ou une extension Firefox à la place, qui peuvent fermer de manière fiable la fenêtre en cours.
Cependant, étant donné que 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 en empaquetant le travail d'extension pour vous).
**Envisagez de faire une demande de fonctionnalité.
Chrome is currently était vulnérable à l'exploit "self redirection" ;. Ainsi, un code comme celui-ci fonctionnait en général :
open(location, '_self').close();
C'est un comportement bogué, IMO, et il est maintenant (à partir d'avril 2015 environ) principalement bloqué. Cela fonctionnera toujours à partir de code injecté seulement si l'onglet est fraîchement ouvert et n'a aucune page dans l'historique de navigation. Elle n'est donc utile que dans un très petit nombre de cas.
Cependant, une variante fonctionne toujours sur Chrome (v43 & ; v44) plus Tampermonkey (v3.11 ou plus récent). Utilisez un @grant
explicite et un simple window.close()
. EG :
// ==UserScript==
// @name window.close demo
// @include http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant GM_addStyle
// ==/UserScript==
setTimeout (window.close, 5000);
Merci à [zanetu][3] pour la mise à jour. Notez que cela ne fonctionne pas si un seul onglet est ouvert. Elle ne ferme que les onglets supplémentaires.
Firefox est protégé contre cet exploit. Donc, le seul moyen de javascript est de paralyser les paramètres de sécurité, un navigateur à la fois.
Vous pouvez ouvrir about:config
et mettre
allow_scripts_to_close_windows
à 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éjudice.
Il n'existe actuellement aucun paramètre équivalent pour Chrome.
[1] : http://www.w3.org/TR/html51/browsers.html#dom-window-close [2] : https://developer.mozilla.org/en-US/docs/Web/API/Window.close#Description [3] : https://stackoverflow.com/users/735271/zanetu
J'utilise la méthode mise en ligne par Brock Adams et cela fonctionne même dans Firefox, si c'est à l'initiative de l'utilisateur.
open(location, '_self').close();
Je l'appelle à partir d'un bouton, donc à l'initiative de l'utilisateur, et cela fonctionne toujours très bien avec Chrome 35-40, Internet Explorer 11, Safari 7-8 et AUSSI Firefox 29-35. J'ai testé en utilisant la version 8.1 de Windows et Mac OS X 10.6, 10.9 & ; 10.10 si c'est différent.
Code de la fenêtre auto-fermante (sur la page qui se ferme toute seule)
Le code complet à utiliser sur la fenêtre ouverte par l'utilisateur qui peut se fermer toute seule :
fenêtre_à_fermer.htm
JavaScript :
function quitBox(cmd)
{
if (cmd=='quit')
{
open(location, '_self').close();
}
return false;
}
HTML :
<input type="button" name="Quit" id="Quit" value="Quit" onclick="return quitBox('quit');" />
Essayez cette page de test : (Maintenant testée dans Chrome 40 et Firefox 35)
http://browserstrangeness.bitbucket.io/window_close_tester.htm
Code de l'ouvreur de fenêtre (sur une page qui ouvre la page ci-dessus)
Pour que cela fonctionne, la compatibilité entre navigateurs imposée par la sécurité exige que la fenêtre à fermer ait déjà été ouverte par l'utilisateur en cliquant sur un bouton dans le même domaine du site.
Par exemple, la fenêtre qui utilise la méthode ci-dessus pour se fermer toute seule, peut être ouverte à partir d'une page utilisant ce code (code fourni à partir de ma page d'exemple liée ci-dessus) :
window_close_tester.htm
JavaScript :
function open_a_window()
{
window.open("window_to_close.htm");
return false;
}
HTML :
<input type="button" onclick="return open_a_window();" value="Open New Window/Tab" />
Bien que vous pensiez que c'est "manifestement faux", ce que vous dites "semble être une croyance" est en fait correct. La documentation de Mozilla sur [window.close][1] indique que
Cette méthode ne peut être appelée que pour les fenêtres qui ont été ouvertes par un script utilisant la méthode window.open. Si la fenêtre n'a pas été ouverte par un script, l'erreur suivante apparaît dans la console JavaScript : Les scripts ne peuvent pas fermer les fenêtres qui n'ont pas été ouvertes par un script.
Vous dites qu'il est " censé continuer à le faire ", mais je ne pense pas que vous trouverez une référence qui le confirme. Peut-être vous souvenez-vous de quelque chose de mal ?
[1] : https://developer.mozilla.org/en-US/docs/Web/API/Window.close