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

Need a Unique ID in javascript for tab windows and for new windows in Internet Explorer

本问题已经有最佳答案,请猛点这里访问。

需要一种简单的方法来获取Internet Explorer中选项卡窗口的javascript中的唯一ID。我基本上是想知道是否有像document.tab.indexnumber这样的东西,但没有。所以真正的问题是,是否有什么东西可以用来生成这个,或者找出你在哪个选项卡中?同样,我应该能够为另一个Internet Explorer实例获取另一个唯一的ID?我不能用IE插件。

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

我们可以将ID放在URL或隐藏字段中,但该解决方案会干扰网站的设计。寻找一些不那么具有侵入性的东西。


我正在为ASP.NET框架(WebForms和MVC风格)定制会话类。

这个问题虽然很老,但很切题,我找不到其他任何解决问题的方法。

因此,我共享我编写的解决方案,以确保每个窗口和/或选项卡具有唯一和持久的GUID,无论刷新多么困难,都保持静态和安全,在站点外导航并返回,清理缓存等。

magic涉及window.name,由下面的javascript代码实现。引导程序基于jquery,但很容易移植到jquery解决方案。

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

乌伊吉德

已编辑:原始版本在windowLoadSetGUIDOnForms上显示了formList.length == 1的错误。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
//------------------------------------------------------------------------------
//-- 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 ------------------------------------------------

作为POC,我设计了两个HTML脚本,演示了框架或i frames中的子元素的唯一性。

指南HTML

1
2
3
4
5
6
7
8
9
10
<html>
  <head>
    <script language="javascript" type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js">
    <script language="javascript" type="text/javascript" src="UIGUID.js">
  </head>
  <body onloadx="alert('Main document: ' + getWindowGUID());">
    <iframe id="frame001" src="GUIDFrame.html"></iframe>
    <iframe id="frame002" src="GUIDFrame.html"></iframe>
  </body>
</html>

指南框架

1
2
3
4
5
6
7
<html>
  <head>
    <script language="javascript" type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js">
    <script language="javascript" type="text/javascript" src="UIGUID.js">
  </head>
  <body onloadx="alert('iFrame: ' + getWindowGUID());" />
</html>