2016-06-19 10 views
0

Ich habe eine echtzeitfunktion in meiner website, die ein neues fenster auf socket.io ereignis geöffnet von der serverseite (PHP/Laravel 5.1). Das Problem ist, wenn ein Benutzer auf meiner Website angemeldet und öffnete es in mehr als einer Registerkarte/Fenster - die neue window.open Feuer mehrere Zeit, jemand weiß, wie kann ich es verhindern? mein Code sieht wie folgt aus:window.open auf echtzeit ereignis (using socket.io) wenn meine website in mehr als einem fenster öffnen

die Socket-Listener:

socket.on('message', function (data) { 
    data = JSON.parse(data); 
    if(typeof data.data !== "undefined"){ 
     lead_data = data.data; 
    }else{ 
     lead_data = data; 
    } 
    if(typeof lead_data !== "undefined" && (lead_data.event_name == "new_call" || lead_data.event_name == "new_unsaved_call")){ 
     if(lead_data.user_id == uid){ 
      window.App.openCallWindow(data); 
     } 
    } 
}); 

und die openCallWindow Funktion:

openCallWindow : function(data){ 
    void(0); 
    var lead_id = ''; 
    if(data && data.lead){ 
     lead_id = data.lead._id; 
     window.open('/leads/callLead/'+lead_id,'new_lead'+Math.floor((Math.random()*999)+1), "height=800,width=1200"); 
    }else if(typeof data.phone !== "undefined"){ 
     window.open('/leads/callLead/?phone='+data.phone,'new_lead'+Math.floor((Math.random()*999)+1), "height=800,width=1200"); 
    }else{ 
     window.open('/leads/callLead/'+lead_id,'new_lead'+Math.floor((Math.random()*999)+1), "height=800,width=1200"); 
    } 
}, 

danke sehr viel :)

Antwort

1

-Client Seite aktiv Tab Lösung:

Sie könnten window.open nur dann aufrufen, wenn die Registerkarte aktiv ist (aktuell angezeigt).

function isTabActive(){ 
    var state; 

    if (typeof document.hidden !== "undefined") { 
     state = "visibilityState"; 
    } else if (typeof document.mozHidden !== "undefined") { 
     state = "mozVisibilityState"; 
    } else if (typeof document.msHidden !== "undefined") { 
     state = "msVisibilityState"; 
    } else if (typeof document.webkitHidden !== "undefined") { 
     state = "webkitVisibilityState"; 
    } 
    return document[state] != "hidden"; 
} 

Client-seitig mit Cookies

Sie auch bereits geöffnet ist, wenn das Popup zu speichern verwenden könnte Cookies: Dies könnte wie this erfolgen. Cookies können mit js geschrieben und gelesen werden.

Server seitige Lösung mit Socket.io

Wenn Sie Benutzerkonten verwenden sie anstelle der IP! Andernfalls wird es für mehrere Benutzer mit der gleichen IP fehlerhaft sein.

var alreadySend={}; 
io.on('connection', function(socket) 
{ 
    if(!alreadySend.hasOwnProperty(socket.handshake.address)) 
    { 
     socket.emit("create popup", "popup1"); 
     alreadySend[socket.handshake.address]=true; 
    } 
}); 

Reset mit

delete alreadySend[socket.handshake.address]; 

here Außerdem finden Sie ausführlichere Informationen finden über die IP immer mit Socket.io

+0

Vielen Dank für die Antwort Kumpel, aber ich muss immer noch das neue Fenster öffnen, auch wenn die w indow ist nicht aktiv. Gibt es eine Möglichkeit, zu validieren, wie viele Fenster meiner Website geöffnet sind, oder zu überprüfen, ob das Ereignis bereits von einem anderen Ort ausgelöst wurde? – benjah

+0

Ich weiß nicht, ob das möglich ist, aber Sie könnten die IP-Adresse oder den Benutzernamen/userid von socket.io verwenden, um die "Nachricht" nur an eine Verbindung pro IP/Benutzer zu senden. Die IP befindet sich in "socket.handshake.address" und Sie können ein Objekt wie "messageSend [ip/userName] = true/false;" erstellen und dann vor dem Senden abfragen, ob diese IP/Benutzer die Nachricht bereits erhalten haben. – txxt

+0

Ich bin ziemlich neu bei socket.io, können Sie bitte ein Codebeispiel geben? sollte ich es in den Socket-Verbindungshandler hinzufügen? – benjah

0

Sie Zustand und greifen Sie über eine Funktion verwenden können, wie

function isTabActive(){ 
    var state; 

    if (typeof document.hidden !== "undefined") { 
     state = "visibilityState"; 
    } else if (typeof document.mozHidden !== "undefined") { 
     state = "mozVisibilityState"; 
    } else if (typeof document.msHidden !== "undefined") { 
     state = "msVisibilityState"; 
    } else if (typeof document.webkitHidden !== "undefined") { 
     state = "webkitVisibilityState"; 
    } 
    return document[state] != "hidden"; 
}