我的网站有一个实时功能,可以在服务器端触发的 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/