window.open 实时事件(使用 socket.io)当我的网站打开超过一个时 window

window.open on real time event (using socket.io) when my site open in more then one window

我的网站有一个实时功能,可以在服务器端触发的 socket.io 事件上打开新的 window (PHP/Laravel 5.1). 问题是如果用户登录到我的站点并在多个 tab/window 中打开它 - 新的 window.open 多次触发,有人知道我该如何防止它? 我的代码如下所示:

套接字侦听器:

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

openCallWindow函数:

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" );
    }
},

客户端活动标签解决方案:

您只能在选项卡处于活动状态(当前查看)时调用 window.open。 这可以像 this:

这样完成
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";
}

带 cookie 的客户端

如果弹出窗口已经打开,您也可以使用 cookie 进行保存。 Cookies可以用js读写。

服务器端解决方案 socket.io

如果您有用户帐户,请使用它们而不是 ip!否则多用户使用同一个ip会有bug。

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

重置为

delete alreadySend[socket.handshake.address];

另外 here 您可以找到更多关于通过 socket.io

获取 ip 的详细信息

您可以使用状态并通过类似

的函数访问它
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";
}