Le problème est que lorsque j'invoque window.close()
ou que self.close()
cela ne ferme pas la fenêtre. Maintenant, il semble y avoir une croyance que 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 faut afficher une alerte pour confirmer. Cela ne se produit pas.
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 chaque navigateur qui n'est PAS basé sur Chrome? Toute suggestion serait grandement appréciée et je recherche une solution spécifique Javascript, rien de JQuery ou une implémentation tierce.
Mise à jour: Bien qu'une grande partie de ce qui a été suggéré présente de graves limitations et des problèmes d'utilisabilité, la dernière suggestion (spécifique à TamperMonkey) utilisée // @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 tout à fait idéal et ne se généralise pas à tous les cas, c'est une bonne solution dans mon cas.
window.close()
fonctionne pour moi en chrome.window.close
ne fonctionne pas comme il se doit, je pense que cela peut être plus utile que de dire "ça ne marche pas".<a href="javascript:window.close">CLOSE</a>
Réponses:
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 pour
window.close()
: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 :
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 actuellementvulnérable à l'exploit «d'auto-redirection». Donc, un code comme celui-ci fonctionnait en général: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 simplewindow.close()
. PAR EXEMPLE: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éfinirallow_scripts_to_close_windows
surtrue
.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.
la source
dom.allow_scripts_to_close_windows;false
vers,true
mais je suppose que rien dans Chrome sans pirater la source / reconstruire, c'est ainsi que je l'ai contourné pour le moment. Je sais et j'ai parlé au développeur TM et dans la récente version alpha / bêta, nous l'avons mis comme option de compatibilité (réglage du script) pour fonctionner dans un style man-in-the-middle, fonctionne. Je suppose qu'en dehors des hacks, nous n'avons pas de solution propre, dommage.window.close()
fonctionnera dans Tampermonkey si vous définissez@grant
une valeur autre quenone
. Voir ce fil .Chrome Correction des problèmes de sécurité sur la version 36.0.1985.125
Chrome 36.0.1985.125 MERCREDI 16 JUILLET 2014 Note de mise à jour
D'après mon observation, cette mise à jour a résolu le problème d'utilisation
window.close()
de la fermeture de la fenêtre contextuelle. Vous verrez ceci dans la console en cas d'échec, "Les scripts peuvent fermer uniquement les fenêtres qui ont été ouvertes par lui.". Cela signifie que les solutions de contournement hacky (réponse de Brock Adams) peuvent ne pas fonctionner dans la dernière version.Ainsi, dans les versions précédentes de Chrome, le bloc de code ci-dessous peut fonctionner, mais pas avec cette mise à jour.
Pour cette mise à jour, vous devez mettre à jour votre code en conséquence pour fermer la fenêtre contextuelle. L'une des solutions consiste à récupérer l'identifiant de la fenêtre contextuelle et à utiliser
méthode pour le supprimer. L'API Windows de l'extension Chrome se trouve sur chrome.windows .
En fait, mon extension Chrome MarkView faisait face à ce problème et j'ai dû mettre à jour mon code pour qu'il fonctionne pour cette mise à jour Chrome. À propos, MarkView est un outil pour lire et écrire des fichiers Awesome Markdown, il fournit des fonctionnalités telles que le contour du contenu, les tableaux triables et la mise en évidence de la syntaxe du bloc de code avec le numéro de ligne.
J'ai également créé ce post , tous les commentaires sont les bienvenus.
la source
open(location, '_self').close();
- notez l'utilisation de la valeur de retour deopen()
. Cela fonctionne toujours sur Chrome36.0.1985.125 m
open(location, '_self').close();
, j'ai eu une erreur "Non autorisé" à ce sujet. Cette erreur est différente avec 'window.close ()(warning on this"Scripts may close only the windows that were opened by it."). It looked like
open (location,' _self '). Close (); `a avancé un peu, mais cela ne peut pas se terminer dans mon cas. Merci @ brock-adams pour le commentaire.chrome.windows.remove
il dit que je ne trouve pas le symbole chrome. Comment puis-je résoudre ça? dois-je ajouter une sorte de référence?Dans Tampermonkey, vous pouvez maintenant utiliser
Et puis appelez simplement
la source
J'utilise la méthode publiée par Brock Adams et cela fonctionne même dans Firefox, si elle est initiée par l'utilisateur.
Je l'appelle en appuyant sur un bouton, il est donc lancé par l'utilisateur , et il fonctionne toujours 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 et 10.10 si cela est différent.
Code de la fenêtre à fermeture automatique (sur la page qui se ferme)
Le code complet à utiliser sur la fenêtre ouverte par l'utilisateur qui peut se fermer:
window_to_close.htm
JavaScript:
HTML:
Essayez cette page de test: (maintenant testée dans Chrome 40 et Firefox 35)
http://browserstrangeness.bitbucket.io/window_close_tester.htm
Code d'ouverture de fenêtre (sur une page qui ouvre la page ci-dessus)
Pour que cela fonctionne, la compatibilité croisée des navigateurs imposée par la sécurité nécessite que la fenêtre à fermer ait déjà été ouverte par l'utilisateur qui clique sur un bouton dans le même domaine de site.
Par exemple, la fenêtre qui utilise la méthode ci-dessus pour se fermer, peut être ouverte à partir d'une page en utilisant ce code (code fourni à partir de mon exemple de page lié ci-dessus):
window_close_tester.htm
JavaScript:
HTML:
la source
<button onclick="open(location,'_self').close()" >Close Window</button>
. Est-ce que je fais manifestement quelque chose de mal? Il me semble que cela est également lancé par l'utilisateur. Notez que j'obtiens le même résultat si j'utilise un<button>
ou un<input type="button">
.window.open('', '_self', ''); window.close();
mais cela a fonctionné avecopen(location, '_self').close();
De nombreuses personnes essaient encore de trouver un moyen de fermer le navigateur Chrome à l'aide de javascript. La méthode suivante ne fonctionne que lorsque vous utilisez Chrome comme lanceur d'applications - kiosque par exemple!
J'ai testé les éléments suivants:
J'utilise l'extension suivante: Fermer le kiosque
Je suis les instructions d'utilisation et cela semble fonctionner très bien (assurez-vous de vider le cache tout en faisant les tests). Le javascript que j'utilise est (attaché à l'événement de clic):
J'espère que cela aide quelqu'un, car c'est la seule solution efficace que j'ai trouvée.
Remarque: il semble que l'extension s'exécute en arrière-plan et ajoute une icône de la barre d'état Chrome. L'option suivante est cochée: "Laisser Chrome s'exécuter en arrière-plan" (ou texte similaire). Vous devrez peut-être jouer avec, jusqu'à ce que cela fonctionne pour vous. Je l'ai décoché et maintenant cela fonctionne très bien!
la source
Même si vous pensez que c'est «manifestement faux», ce que vous dites «semble être une croyance» est en fait correct. La documentation Mozilla pour window.close dit
Vous dites qu'il est "censé le faire encore" mais je ne pense pas que vous trouverez une référence qui soutienne cela, peut-être que vous vous êtes mal souvenu de quelque chose?
la source
J'ai trouvé une nouvelle façon qui fonctionne parfaitement pour moi
la source
Le code ci-dessous a fonctionné pour moi -
Testé sur Chrome 43.0.2357.81
la source
Cela peut être vieux, mais répondons-y.
J'utilise top.close () pour fermer un onglet. window.close () ou autre open ... close n'a pas fonctionné pour moi.
la source
"Scripts may not close windows that were not opened by script."
problème mentionné dans d'autres réponses.Dans mon cas, la page devait se fermer, mais peut avoir été ouverte par un lien et
window.close
échouerait donc.La solution que j'ai choisie est d'émettre le
window.close
, suivi d'unwindow.setTimeout
qui redirige vers une autre page.De cette façon, si elle
window.close
réussit, l'exécution sur cette page s'arrête, mais si elle échoue, dans une seconde, elle sera redirigée vers une autre page.la source
Cette réponse de Brock a fonctionné pour moi. javascript ne doit pas être autorisé à fermer une fenêtre qui n'a pas été ouverte par ce même javascript.
Je ne peux fermer la fenêtre enfant que si je la ferme à partir du javascript parent. donc chez mes parents je peux faire quelque chose comme ça.
la source
Vous pouvez également essayer d'utiliser mon code ci-dessous. Cela vous aidera également à rediriger votre fenêtre parent:
Parent:
Apparaitre:
la source
Pour TamperMonkey:
Réf: https://www.tampermonkey.net/documentation.php#_grant
la source
Ce n'est que si vous ouvrez une nouvelle fenêtre en utilisant window.open () que la nouvelle fenêtre pourra se fermer en utilisant le code comme je l'ai mentionné ci-dessus. Cela fonctionne parfaitement pour moi :) Remarque: n'utilisez jamais href pour ouvrir la page dans un nouvel onglet. Window.close () ne fonctionne pas avec "href". Utilisez plutôt window.open ().
la source
Je voulais partager ma «solution» avec ce problème. Il semble que la plupart d'entre nous essayent de fermer une fenêtre de navigateur dans une session de navigateur standard, où un utilisateur visite un site Web ou un autre, après avoir visité d'autres sites Web et avant d'en visiter d'autres.
Cependant, ma situation est que je crée une application Web pour un appareil qui sera essentiellement la seule chose que l'appareil fera. Vous le démarrez, il lance Chrome et accède à notre application. Il n'est même pas connecté à Internet, tous les serveurs auxquels il parle se trouvent sur nos conteneurs Docker locaux. L'utilisateur a besoin d'un moyen de fermer l'application (c'est-à-dire de fermer Chrome) afin de pouvoir accéder au terminal pour effectuer des mises à jour du système.
Alors il démarre, lance Chrome en mode kiosque, déjà à la bonne adresse. Cela se produit pour satisfaire facilement la deuxième option de la spécification:
Donc, simplement appeler
window.close()
depuis mon application de kiosque fonctionne !la source
Essayez quelque chose comme ceci onclick = "return self.close ()"
la source