需要在javascript中为标签窗口和Internet Explorer中的新窗口提供唯一ID

mrj*_*ohn 6 javascript internet-explorer

需要一种简单的方法来获取Internet Explorer中标签窗口的javascript中的唯一ID.我基本上想知道是否有类似document.tab.indexnumber的东西,但没有.所以真正的问题是,是否有任何可用于生成此内容或找出您所在的选项卡的内容?同样,我应该能够获得另一个Internet Explorer实例的另一个唯一ID?
我不能使用IE插件.

另一个复杂因素是我们可以使用随机数生成器加上时间戳作为唯一ID,如下面其中一个答案中所建议的那样.但是,如何在该选项卡的同一会话中保留相同的数字.如果我将它存储在会话变量中,则会在该会话的所有选项卡/窗口之间共享它.

我们可以将id放在url或隐藏字段中,但该解决方案将侵入网站的设计.寻找不那么具有侵入性的东西.

Mar*_*peu 4

我正在为 ASP.Net 框架(WebForms 和 MVC 风格)定制 Session 类。

虽然很老了,但这个问题非常相关,我找不到任何其他解决该问题的方法。

因此,我分享了我编写的解决方案,以确保每个窗口和/或选项卡都有一个唯一且持久的 GUID,无论刷新、导航到网站外并返回、清理缓存等如何努力,都保持静态和安全。

这个魔法涉及window.name并由下面的 JavaScript 代码实现。该引导程序基于 jQuery,但可以轻松移植到无 jQuery 的解决方案。

请注意,此 GUID 会自动附加到任何现有的form提供服务器端引用。


UIGUID.js


编辑:windowLoadSetGUIDOnForms原始版本在for处出现错误formList.length == 1

//------------------------------------------------------------------------------
//-- guarantees that window.name is a GUID, and that it would
//-- be preserved whilst window life cicle
//--
//-- for frames and iframes, the outermost window determines the GUID
//--
//-- for every form it will be appended a hidden element of id
//-- "this.window.GUID" for server-side references
//------------------------------------------------------------------------------
//-- window.name will be set to "GUID-<A_GUID>"
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
//-- Retrieves window GUID, initializing it if necessary -----------------------
//------------------------------------------------------------------------------

function getWindowGUID() {
    //----------------------------------
    var windowGUID = function () {
        //----------
        var S4 = function () {
            return (
                    Math.floor(
                            Math.random() * 0x10000 /* 65536 */
                        ).toString(16)
                );
        };
        //----------

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

    //-- traverses up in the hierarchy for the outermost window ----------------

    var topMostWindow = window;

    while (topMostWindow != topMostWindow.parent) {
        topMostWindow = topMostWindow.parent;
    }

    //-- initialize GUID if needed ---------------------------------------------

    if (!topMostWindow.name.match(/^GUID-/)) {
        topMostWindow.name = "GUID-" + windowGUID();
    }

    //-- return GUID -----------------------------------------------------------

    return topMostWindow.name;
} //-- getWindowGUID -----------------------------------------------------------

//------------------------------------------------------------------------------
//-- Append via jQuery handlers for windowLoad ---------------------------------
//------------------------------------------------------------------------------

$(window).load(
    function () {
        windowLoadSetGUID();
        windowLoadSetGUIDOnForms();
    }
) //----------------------------------------------------------------------------

function windowLoadSetGUID() {
    var dummy = getWindowGUID();
} //-- windowLoadSetGUID -------------------------------------------------------

function windowLoadSetGUIDOnForms() {
    var formList = $('form');
    var hidGUID = document.createElement("input");

    hidGUID.setAttribute("type", "hidden");
    hidGUID.setAttribute("name", "this.window.GUID");
    hidGUID.setAttribute("value", getWindowGUID());

    if (formList.length == 1) {
        formList.append(hidGUID);
    }
    else {
        for (var i = 0; i < formList.length; ++i) {
            formList[i].append(hidGUID);
        }
    }
} //-- windowLoadSetGUIDOnForms ------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

作为 POC,我设计了两个 HTML 脚本,展示了框架或 iFrame 中的子元素的独特性


GUIDTest.html


<html>
  <head>
    <script language="javascript" type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
    <script language="javascript" type="text/javascript" src="UIGUID.js"></script>
  </head>
  <body onLoad="alert('Main document: ' + getWindowGUID());">
    <iframe id="frame001" src="GUIDFrame.html"></iframe>
    <iframe id="frame002" src="GUIDFrame.html"></iframe>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

GUIDFrame.html


<html>
  <head>
    <script language="javascript" type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
    <script language="javascript" type="text/javascript" src="UIGUID.js"></script>
  </head>
  <body onLoad="alert('iFrame: ' + getWindowGUID());" />
</html>
Run Code Online (Sandbox Code Playgroud)