我在我的网站上有一个实时功能,在从服务器端( 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" );
}
},
非常感谢你:)
答案 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";
}