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

标签 javascript socket.io dom-events

我的网站有一个实时功能,可以在服务器端触发的 socket.io 事件上打开新窗口(PHP/Laravel 5.1)。 问题是,如果用户登录到我的网站并在多个选项卡/窗口中打开它 - 新的 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 进行保存。 可以用js来写入和读取cookie。

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

关于javascript - 当我的网站在多个窗口中打开时,window.open 实时事件(使用 socket.io),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37907660/

相关文章:

javascript - 如何查询orchestrate.io

javascript - io.connect 不适用于本地 html 页面

Javascript DOMContentLoaded 事件未在 Internet Explorer 中触发

javascript - 如何通过 jQuery 在 Select2 中获取额外的参数值?

javascript - 使用 Express 和 Mongoose 将表单数据发送到现有 MongoDB 文档数组

javascript - 三次线图无法正确绘制?

javascript - object.watch(), 获取新值

javascript - 从 JAVA 发送数据到 node.js/socket.io 服务器

node.js - 如何在 2 个 node.js 实例之间高效地传输文件?

javascript - 如何在悬停在 anchorEl 和 'popover' 上时继续显示 'popover'?