小编典典

在javascript中,如何在同一个基于cookied的sessionId下唯一地识别一个浏览器窗口与另一个浏览器窗口

ajax

我的Web应用程序的用户可能打开了多个浏览器窗口并指向同一页面。我希望页面中某些内容的状态(通过ajax加载)在回发中得以保留。我既可以存储在Cookie中,也可以存储在服务器上。无论哪种方式,我都无法想到如何区分每个窗口。

例如,假设用户Bob在ListOfSomething页面上打开了两个浏览器窗口。每个列表都有一个 LoadedPageNumber
属性,我需要保留该属性。否则,用户刷新时总会出现在页面1上。Bob可能已经加载了浏览器窗口1并将其指向第5页,然后加载了浏览器窗口2并将其指向第14页。如果我仅基于会话ID存储该属性,则Bob刷新后将在窗口1中获得第14页。

请注意,我的状态变量实际上比这个简单示例复杂得多,而我无法持久保存它们可能会导致大问题(我的应用程序存在缺陷)。

我需要某种浏览器窗口ID或其他内容。当然,它必须是跨浏览器的解决方案(IE6 +,Wekbit?+,FF2 +)

有任何想法吗?

关于相关性的注意事项:请记住,这对于将基于旧表单的页面与较新的启用AJAX的项混合使用的情况也很有用。有时您需要回发表单,而又不想丢失某些客户端状态值。


阅读 335

收藏
2020-07-26

共1个答案

小编典典

您可以设置自己的窗口名称,确切的语法现在使我无所适从,但是您可以使用当前时间和会话ID在窗口加载时创建唯一的ID,然后使用该ID

可以通过在javascript window.open()函数中设置名称的方式进行此操作(但是您可以将其设置为self,而不是新窗口)

谷歌搜索显示:

self.window.name = myclass.getUniqueWindowId(thisSession);

更新

关于您需要从刷新保存到刷新,我做了一些测试,它看起来从刷新保存到刷新。使用Firefox 3,在初始加载时,窗口名称为空白,然后一遍又一遍地按CTRL +
R,然后填充窗口名称。然后我注释掉了设置的名称代码并重新加载,它仍然保留了该名称。

<script type="text/javascript">

    alert( self.window.name );

    self.window.name = "blah";

</script>

更新

我必须注意到以下有关jQuery’jquery-session’插件的评论,该评论确实有效,并且提供的功能比这里讨论的更多。

尽管 ,但也应该明确指出它依赖HTML5的Web存储, 而较旧的IE 版本 不支持

企业仍然严重依赖IE 7(在巴西此处为“及以下”)。

基于self.window.name针对所有不符合HTML5的解决方案,我提供了以下代码段作为跨浏览器解决方案:

<script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>
<script language="javascript" type="text/jscript">
    //----------------------------------------------------------------------
    //-- guarantees that window.name is a GUID, and that it would
    //-- be preserved whilst this window's life cicle
    //----------------------------------------------------------------------
    //-- window.name will be set to "GUID-<SOME_RANDOM_GUID>"
    //----------------------------------------------------------------------

    $(window).load(
        function () {
            //----------------------
            var GUID = function () {
                //------------------
                var S4 = function () {
                    return(
                            Math.floor(
                                    Math.random() * 0x10000 /* 65536 */
                                ).toString(16)
                        );
                };
                //------------------

                return (
                        S4() + S4() + "-" +
                        S4() + "-" +
                        S4() + "-" +
                        S4() + "-" +
                        S4() + S4() + S4()
                    );
            };
            //----------------------

            if (!window.name.match(/^GUID-/)) {
                window.name = "GUID-" + GUID();
            }
        }
    ) //--------------------------------------------------------------------
</script>

我在这里找到了GUID函数(为此我提出了一些代码清除的建议)。

2020-07-26