在javascript中,如何从另一个浏览器窗口中唯一标识同一个基于cookied的sessionId的浏览器窗口

srm*_*ark 28 ajax persistence state

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

例如,假设用户Bob有两个浏览器窗口打开ListOfSomething页面.每个列表都有一个LoadedPageNumber属性,我需要保留它.否则用户在刷新时总是在第1页结束.Bob可能已加载浏览器窗口1并将其指向第5页,然后加载浏览器窗口2并将其指向第14页.如果我只是根据会话ID存储该属性,则Bob将在窗口1中获取第14页(如果他刷新).

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

我需要某种浏览器窗口ID或其他东西.它当然需要是一个跨浏览器的解决方案(IE6 +,Wekbit?+,FF2 +)

有任何想法吗?

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

Roy*_*ico 37

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

这可以像在javascript window.open()函数中设置名称一样完成(但你可以自己做,而不是新窗口)

谷歌搜索显示:

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

UPDATE

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

<script type="text/javascript">

    alert( self.window.name );

    self.window.name = "blah";

</script>
Run Code Online (Sandbox Code Playgroud)

UPDATE

我必须注意下面关于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>
Run Code Online (Sandbox Code Playgroud)

我在这里找到了GUID函数(为此我提出了一些代码清理).