Désolé pour le nécropostage, mais j'ai récemment implémenté un site hébergé local qui avait besoin de pouvoir fermer l'onglet du navigateur actuel et trouvé des solutions de contournement intéressantes qui ne sont pas bien documentées où que je puisse trouver, alors je me suis engagé à le faire.
Remarque: Ces solutions de contournement ont été effectuées avec un site hébergé localement à l'esprit et (à l'exception d'Edge) nécessitent que le navigateur soit spécifiquement configuré, donc ne serait pas idéal pour les sites hébergés publiquement.
Contexte: Par le passé, le script jQuery window.close()
était capable de fermer l'onglet actuel sans problème sur la plupart des navigateurs. Cependant, les navigateurs modernes ne prennent plus en charge ce script, potentiellement pour des raisons de sécurité.
Google Chrome:
Chrome n'autorise pas l'exécution du script window.close () et rien ne se passe si vous essayez de l'utiliser. En utilisant le plugin Chrome TamperMonkey, nous pouvons cependant utiliser la méthode window.close () si vous incluez le // @grant window.close
dans l'en-tête UserScript de TamperMonkey.
Par exemple, mon script (qui est déclenché lorsqu'un bouton avec id = 'close_page' est cliqué et si 'oui' est pressé dans la fenêtre contextuelle du navigateur) ressemble à:
// ==UserScript==
// @name Close Tab Script
// @namespace http://tampermonkey.net/
// @version 1.0
// @description Closes current tab when triggered
// @author Mackey Johnstone
// @match http://localhost/index.php
// @grant window.close
// @require http://code.jquery.com/jquery-3.4.1.min.js
// ==/UserScript==
(function() {
'use strict';
$("#close_page").click(function() {
var confirm_result = confirm("Are you sure you want to quit?");
if (confirm_result == true) {
window.close();
}
});
})();
Remarque: Cette solution ne peut cependant fermer l'onglet que si ce n'est PAS le dernier onglet ouvert. Donc, efficacement, il ne peut pas fermer l'onglet si cela provoquait la fermeture de la fenêtre en étant le dernier onglet ouvert.
Firefox:
Firefox a un paramètre avancé que vous pouvez activer pour permettre aux scripts de fermer les fenêtres, ce qui active efficacement la window.close()
méthode. Pour activer ce paramètre, accédez à about: config puis recherchez et recherchez la préférence dom.allow_scripts_to_close_windows et passez de false à true.
Cela vous permet d'utiliser la window.close()
méthode directement dans votre fichier jQuery comme vous le feriez pour tout autre script.
Par exemple, ce script fonctionne parfaitement avec la préférence définie sur true:
<script>
$("#close_page").click(function() {
var confirm_result = confirm("Are you sure you want to quit?");
if (confirm_result == true) {
window.close();
}
});
</script>
Cela fonctionne beaucoup mieux que la solution de contournement de Chrome car il permet à l'utilisateur de fermer l'onglet actuel même s'il s'agit du seul onglet ouvert et ne nécessite pas de plug-in tiers. Le seul inconvénient, cependant, est qu'il permet également à ce script d'être exécuté par différents sites Web (pas seulement celui sur lequel vous prévoyez de l'utiliser), ce qui pourrait potentiellement constituer un danger pour la sécurité, bien que je ne puisse pas imaginer que la fermeture de l'onglet actuel soit particulièrement dangereuse.
Bord:
Décevant, Edge a en fait réalisé le meilleur des 3 navigateurs que j'ai essayés et a travaillé avec la window.close()
méthode sans nécessiter de configuration. Lorsque le window.close()
script est exécuté, une fenêtre contextuelle supplémentaire vous avertit que la page tente de fermer l'onglet actuel et vous demande si vous souhaitez continuer.
Remarque finale: Les solutions pour Chrome et Firefox sont des solutions de contournement pour quelque chose que les navigateurs ont intentionnellement désactivé, potentiellement pour des raisons de sécurité. Ils exigent également que l'utilisateur configure au préalable leurs navigateurs pour qu'ils soient compatibles, ce qui ne serait probablement pas viable pour les sites destinés à un usage public, mais ils sont idéaux pour les solutions hébergées localement comme la mienne.
J'espère que cela vous a aidé! :)