¿Cómo saber o verificar si las dos pestañas del navegador ya están abiertas y si esas pestañas están abiertas, el usuario recibirá un cuadro de alerta o un cuadro de mensaje que dice que 'la URL ya está abierta', algo así, en JavaScript puro / nativo? Esta pestaña del navegador contiene un sitio web externo que no tengo ningún privilegio para manipularlo o cambiarlo. Gracias

URL de ejemplo

yahoo.com and google.com

Quiero alertar al usuario si ya hay una pestaña abierta para yahoo.com y google.com

Y quiero usar tabCreate para abrir la url de esta manera:

tabCreate("http://maps.google.com/", "tabMapsPermanentAddress");
mean to open a new tab, it is use in creating chrome extension
14
User014019 4 sep. 2014 a las 13:13

3 respuestas

La mejor respuesta

Puedes usar algo como seguir

<!-- 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();
};

Working jsBin | Más información sobre el método window.open

Si desea controlar más de una ventana, use el fragmento a continuación

<!-- 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);
  }
};

JsBin de trabajo

Si no desea que se carguen en una ventana separada, simplemente excluya esta línea

random = Math.floor((Math.random()*100)+1);

Y elimine la referencia random de la siguiente línea

w[i] = window.open(url, "_blank", random, "menubar=0,scrollbars=0");

Nota al margen: como puede ver arriba, creamos dos ventanas con contenido de terceros; debe saber que no hay forma de obtener ninguna referencia (a la ventana principal / inicial) de ellos.

9
hex494D49 5 sep. 2014 a las 14:28

Esta respuesta: https://stackoverflow.com/a/28230846 es una alternativa que no requiere la biblioteca Cookies / js-cookie . Se adapta mejor a mis necesidades. En pocas palabras (ver la respuesta vinculada para una descripción completa):

$(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.
}
0
Paul Higgins 8 jun. 2018 a las 14:23

Una idea básica es almacenar el recuento de pestañas en una cookie o localStorage, incrementándolo en la carga de la página y decrementándolo en la descarga de la página:

if (+localStorage.tabCount > 0)
    alert('Already open!');
else
    localStorage.tabCount = 0;

localStorage.tabCount = +localStorage.tabCount + 1;
window.onunload = function () {
    localStorage.tabCount = +localStorage.tabCount - 1;
};

Intente abriendo este violín en varias pestañas.

Sin embargo, tenga en cuenta que esta técnica es bastante frágil. Por ejemplo, si por alguna razón el navegador falla, el controlador de descarga no se ejecutará y se perderá la sincronización.

5
Casey Chu 5 sep. 2014 a las 04:25