2010-08-30 34 views
5

Cần một cách tiếp cận đơn giản để nhận ID duy nhất trong javascript cho cửa sổ tab trong Internet Explorer. Tôi về cơ bản đã tự hỏi nếu có cái gì đó giống như document.tab.indexnumber, mà không có. Vì vậy, câu hỏi thực sự là nếu có bất cứ điều gì có thể được sử dụng để tạo ra điều này hoặc tìm ra những gì bạn đang ở trong tab? Tương tự như vậy tôi sẽ có thể nhận được một id duy nhất cho một trường hợp khác của internet explorer?
Tôi không thể sử dụng trình bổ sung IE cho việc này.Cần một ID duy nhất trong javascript cho cửa sổ tab và cho các cửa sổ mới trong Internet Explorer

Một biến chứng khác là chúng tôi có thể sử dụng trình tạo số ngẫu nhiên cùng với dấu thời gian cho một id duy nhất như được đề xuất bên dưới trong một trong các câu trả lời. Nhưng làm thế nào tôi có thể giữ cùng số này trong cùng một phiên cho tab đó. Nếu tôi lưu trữ nó trong một biến phiên, nó được chia sẻ giữa tất cả các tab/cửa sổ với phiên đó.

Chúng tôi có thể đặt id vào url hoặc trường ẩn, nhưng giải pháp đó sẽ xâm nhập vào thiết kế của trang web. Tìm kiếm thứ gì đó ít xâm phạm hơn.

+0

Mã của bạn đang chạy ở đâu? ProcessID + ThreadID có thể sẽ hoạt động nếu mã của bạn đang chạy như một IE Addon. – EricLaw

+0

Mã đang chạy trong javascript trong Internet Explorer 6, 7 hoặc 8.Tôi không thể sử dụng trình bổ sung IE cho câu hỏi này – mrjohn

+2

Câu hỏi này KHÔNG phải là bản sao của câu trả lời được liên kết. Câu hỏi này rõ ràng là hỏi về việc liên kết một định danh duy nhất với một cửa sổ tab trong IE. Nó không phải là một câu hỏi về làm thế nào để tạo ra một GUID (mặc dù đó có thể là một phần của câu trả lời). – Sarus

Trả lời

3

Tôi đang làm việc trong lớp Phiên tùy chỉnh cho khung công tác ASP.Net (cả WebForms và hương vị MVC).

Mặc dù rất cũ, câu hỏi này rất phù hợp và tôi không thể tìm thấy bất kỳ địa chỉ nào khác về vấn đề được đưa ra.

Do đó, tôi chia sẻ giải pháp tôi mã hóa để đảm bảo GUID duy nhất và liên tục cho mỗi cửa sổ và/hoặc tab, giữ an toàn và bảo mật bất kể mức độ làm mới, điều hướng bên ngoài trang web và trả về, xóa bộ nhớ cache, v.v. .

Phép thuật liên quan đến window.name và được triển khai bằng mã JavaScript bên dưới. Bootstrap dựa trên jQuery, nhưng dễ dàng di chuyển đến các giải pháp jQuery-less.

Lưu ý rằng GUID này được tự động nối vào bất kỳ tài liệu nào hiện có của form cung cấp các tham chiếu phía máy chủ.


UIGUID.js


được sửa đổi: phiên bản gốc được trình bày một lỗi ở windowLoadSetGUIDOnForms cho 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 ------------------------------------------------ 

Như POC, tôi nghĩ ra hai kịch bản HTML thể hiện tính duy nhất ngay cả ở các phần tử con trong khung hoặc iFrames


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> 

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> 
+0

Ah! Có thể nói rằng điều này làm việc cho bất kỳ trình duyệt hiện tại ... :-) –

+0

Bất cứ ai có thể chuyển đổi này để JQuery?!?!?! –

Các vấn đề liên quan