当我的网站在多个窗口中打开时,window.open实时事件(使用socket.io)

时间:2016-06-19 13:17:48

标签: javascript javascript-events socket.io

我在我的网站上有一个实时功能,在从服务器端( PHP / Laravel 5.1 )触发的socket.io事件上打开新窗口。 问题是如果用户登录我的网站并在多个选项卡/窗口中打开它 - 新窗口。打开多次,有人知道如何防止它? 我的代码看起来像这样:

套接字侦听器:

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

非常感谢你:)

2 个答案:

答案 0 :(得分:1)

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

如果选项卡处于活动状态(当前已查看),则只能打开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进行保存。 可以使用js编写和阅读Cookie。

使用socket.io的服务器端解决方案

如果你有用户帐户使用它们而不是ip!否则,对于具有相同ip的多个用户来说,它将是错误的。

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的更多详细信息

答案 1 :(得分:0)

您可以使用状态并通过

等功能访问它
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";
}