通过javascript更新多个窗口

Update multiple windows via javascript

本文关键字:窗口 更新 javascript 通过      更新时间:2023-09-26

我的站点设置了超时,因此在活动 15 分钟后,会出现一个登录屏幕,要求您刷新会话。

这很好用,但是如果您在网站上打开了多个窗口,则意味着一个页面将使用登录详细信息刷新,但另一个页面不会。

所以问题是,有没有办法在站点打开的每个窗口上执行以下代码?

$jq('#loginbox').hide()

感谢您的任何帮助。 我还应该声明,其他窗口不会通过JavaScript打开,用户可能只是在新窗口/链接选项卡上单击打开

你无法访问你没有用JS打开的窗口。

每个窗口都应检测到它已超时并显示登录对话框。如果用户在窗口 A 中登录,则窗口 B 应轮询服务器以检测是否已创建会话,并在这种情况下自行恢复。

在切换到刷新屏幕(弹出窗口?)之前,您可以简单地对服务器进行 ajax 调用以查看用户上次刷新的时间 - 如果用户仍然合法登录,只需将计时器重置为正确的时间。

如果另一个窗口不是通过 JavaScript 打开的,您将无法以编程方式访问它。换句话说,原始窗口将无法在另一个窗口上调用 JavaScript 函数。

但是,如果窗口具有相同的域(如果它们位于同一网站上),则可以共享 Cookie。因此,一种可能性是让另一个窗口轮询会话 cookie 的更新,原始窗口可以写入该窗口。一旦会话 cookie 获得特定值,另一个窗口就可以检测到此更改并按照您认为合适的方式做出反应。

感谢所有发布想法的人,我选择了以下解决方案,如果有人可以增强它并发布代码,那么我会接受它作为答案:

$jq(function(){
    $jq(window).bind('blur', function(){checkloginrefreshed();});
    $jq(window).bind('focus', function(){checkloginrefreshed();});
    $jq(document).bind('focusout', function(){checkloginrefreshed();});
    $jq(document).bind('focusin', function(){checkloginrefreshed();});
});
function createCookie(name,value,hours) {
    if (hours) {
        var date = new Date();
        date.setTime(date.getTime()+(hours*60*60*1000));
        var expires = "; expires="+date.toGMTString();
    }
    else var expires = "";
    document.cookie = name+"="+value+expires+"; path=/";
}
function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}
function eraseCookie(name) {
    createCookie(name,"",-1);
}
function checkloginrefreshed(){
    if (parseInt(readCookie("loginset")) == 1){
        eraseCookie("loginset");        
        $jq('#timeoutwarning').dialog("close");
        $jq('#timeoutwarning').html(TIMEOUTLOGINFORM);
        clearTimeout(timer);
        clearTimeout(timerWarning);
        setupTimers();
    }
}