Comment savoir ou vérifier si l'onglet des deux navigateurs est déjà ouvert et si ceux-ci sont ouverts, l'utilisateur recevra un message d'alerte ou un message indiquant que "l'URL est déjà ouverte", quelque chose comme ça, en JavaScript pur/natif? Cet onglet de navigateur contient un site Web externe sur lequel je ne dispose d'aucun privilège pour le manipuler ou le modifier. Merci
Exemple d'URL
yahoo.com and google.com
Je souhaite alerter l'utilisateur s'il existe déjà un onglet ouvert pour yahoo.com et google.com
Et je veux utiliser tabCreate pour ouvrir l'URL comme ceci:
tabCreate("http://maps.google.com/", "tabMapsPermanentAddress");
mean to open a new tab, it is use in creating chrome extension
Vous pouvez utiliser quelque chose comme suivre
<!-- HTML -->
<a id="opener">Open window</a>
// JavaScript
var a = document.getElementById('opener'), w;
a.onclick = function() {
if (!w || w.closed) {
w = window.open("https://www.google.com","_blank","menubar = 0, scrollbars = 0");
} else {
console.log('window is already opened');
}
w.focus();
};
Travailler jsBin | Plus d'informations sur la méthode window.open
Si vous souhaitez contrôler plusieurs fenêtres, utilisez l'extrait de code ci-dessous.
<!-- HTML -->
<a href="https://www.google.com" class="opener">Open google.com</a> |
<a href="http://www.yahoo.com" class="opener">Open yahoo.com</a>
//JavaScript
window.onload = function(){
var a = document.querySelectorAll('.opener'), w = [], url, random, i;
for(i = 0; i < a.length; i++){
(function(i){
a[i].onclick = function(e) {
if (!w[i] || w[i].closed) {
url = this.href;
random = Math.floor((Math.random() * 100) + 1);
w[i] = window.open(url, "_blank", random, "menubar = 0, scrollbars = 0");
} else {
console.log('window ' + url + ' is already opened');
}
e.preventDefault();
w[i].focus();
};
})(i);
}
};
Si vous ne voulez pas qu'ils soient chargés dans une fenêtre séparée, excluez simplement cette ligne
random = Math.floor((Math.random()*100)+1);
et supprimer la référence random
de la ligne suivante
w[i] = window.open(url, "_blank", random, "menubar=0,scrollbars=0");
Note latérale: Comme vous pouvez le voir ci-dessus, nous avons créé deux fenêtres avec du contenu tiers; vous devriez savoir qu'il n'y a aucun moyen d'obtenir d'eux une référence (à la fenêtre parent/ouvre).
Une idée de base est de stocker le nombre d'onglets dans un cookie ou dans localStorage
, en l'incrémentant au chargement de la page et en le décrémentant au déchargement de la page:
if (+localStorage.tabCount > 0)
alert('Already open!');
else
localStorage.tabCount = 0;
localStorage.tabCount = +localStorage.tabCount + 1;
window.onunload = function () {
localStorage.tabCount = +localStorage.tabCount - 1;
};
Essayez ouvrez ce violon dans plusieurs onglets.
Notez que cette technique est assez fragile, cependant. Par exemple, si, pour une raison quelconque, le navigateur se bloque, le gestionnaire de déchargement ne s'exécutera pas et il ne sera plus synchronisé.
La réponse de Casey Chu fonctionne correctement jusqu'à ce que le navigateur se bloque avec la page ouverte. Lors de toute prochaine exécution, l’objet localStorage
aura initialisé tabCount
avec une valeur autre que zéro. Par conséquent, une meilleure solution consiste à stocker la valeur dans un cookie de session. Le cookie de session sera supprimé lorsque le navigateur se fermera correctement. Lorsque le navigateur se bloque, le cookie de session sera en réalité préservé, mais heureusement pour la prochaine exécution du navigateur.
L'objet sessionStorage
est distinct pour chaque onglet, il ne peut donc pas être utilisé pour le nombre d'onglets de partage.
C'est la solution améliorée utilisant js-cookie library.
if (+Cookies.get('tabs') > 0)
alert('Already open!');
else
Cookies.set('tabs', 0);
Cookies.set('tabs', +Cookies.get('tabs') + 1);
window.onunload = function () {
Cookies.set('tabs', +Cookies.get('tabs') - 1);
};
Cette réponse: https://stackoverflow.com/a/28230846 est une alternative qui n'exige pas la bibliothèque Cookies/js-cookie. Cela répondait mieux à mes besoins. En résumé (voir la réponse liée pour une description complète):
$(window).on('storage', message_receive);
...
// use local storage for messaging. Set message in local storage and clear it right away
// This is a safe way how to communicate with other tabs while not leaving any traces
//
function message_broadcast(message)
{
localStorage.setItem('message',JSON.stringify(message));
localStorage.removeItem('message');
}
// receive message
//
function message_receive(ev)
{
if (ev.originalEvent.key!='message') return; // ignore other keys
var message=JSON.parse(ev.originalEvent.newValue);
if (!message) return; // ignore empty msg or msg reset
// here you act on messages.
// you can send objects like { 'command': 'doit', 'data': 'abcd' }
if (message.command == 'doit') alert(message.data);
// etc.
}