2009-05-11 35 views
28

Nếu người dùng trên trang web của bạn và mở một liên kết khác (cũng đến trang web của bạn) trong tab mới, có thể phân biệt được điều này với người dùng chỉ cần nhấp vào liên kết bình thường không? Điều này có thể là trong javascript, trên máy chủ, bất cứ điều gì.Có thể phát hiện xem người dùng đã mở một liên kết trong một tab mới chưa?

Tôi đoán câu trả lời là bạn không thể làm điều này, nhưng tôi muốn kiểm tra lại.

Trả lời

32

Bạn loại có thể làm điều đó như thế này:

if (history.length == 1) { // Um, needs to be 0 for IE, 1 for Firefox 
    // This is a new window or a new tab. 
} 

Có thể có những cách khác để history.length1, nhưng tôi không biết những gì họ có thể.

+0

Bạn cũng có thể xem history.previous ... –

+0

@ Jason: Tôi nhận được các lỗi về quyền trong Firefox khi tôi thử xem history.previous. – RichieHindle

+0

@RichieHindle: hmmm ... Tôi đã cố gắng đặt ngón tay lên đó ... nhưng yep ... đó là lý do tôi hút ... –

0

Tôi thực sự không nghĩ vậy. Gần nhất bạn có thể nhận được như xa như tôi biết là giám sát các sự kiện bấm phím và mouseclick để cố gắng để phù hợp với hành động để phương pháp phổ biến để mở liên kết trong các tab mới. (ví dụ: nếu họ đang giữ Lệnh khi họ nhấp hoặc nhấp chuột giữa, đó có thể là một tab mới). Điều đó sẽ không đáng tin cậy mặc dù, như bất kỳ những ràng buộc có thể được thay đổi.

2

Câu trả lời ngắn gọn là, không. Câu trả lời dài là, nếu bạn đang thực hiện một cuộc gọi ajaxy từ các trang của bạn đến các phương thức phía máy chủ, điều đó có thể giữ cho việc mở cửa sổ bật lên (được gọi trong một khung thời gian ngắn). Nó sẽ là một mớ hỗn độn cẩu thả, không đáng tin cậy, và bạn không thể phân biệt giữa một cửa sổ mới hoặc một tab cho vấn đề đó.

3

Thuộc tính window.opener trong JavaScript sẽ trỏ đến cửa sổ đã mở cửa sổ mới. Tuy nhiên, nó không phân biệt giữa một cửa sổ mới và một tab mới. Các tab không phải là một phần của thông số W3C chính thức nên không có hỗ trợ trực tiếp cho chúng.

+0

+1 để sử dụng window.opener –

+0

window.opener là null đối với tôi trong Firefox khi tôi "Mở Liên kết trong Tab Mới". – RichieHindle

+1

window.opener chỉ được đặt khi sử dụng cửa sổ js.open, không phải thông qua tác vụ người dùng trên thẻ A. – Tracker1

0

Đó là hành vi của khách hàng, vì vậy tôi nghĩ bạn có thể làm điều gì đó với javascript, như kiểm tra lịch sử trình duyệt, nhưng không rõ ràng giữa tab mới và cửa sổ mới.

Bên cạnh đó, không phải tất cả các trình duyệt đều có tab và không phải tất cả các trình duyệt đều có cùng ý nghĩa đối với tab là gì (trong một số quy trình khác, trong một số trình duyệt khác).

Nhưng, tại sao bạn muốn kiểm tra điều đó? Nó thực sự quan trọng nếu ứng dụng của bạn đang thực hiện trong một tab mới hay không? Tôi không nghĩ vậy ...

11

Ngoài history.length trong JavaScript, bạn có thể đọc/ghi tên cửa sổ. Vì vậy, nếu bạn kiểm tra xem nó có tải tên không ... nó nên để trống trên lần tải đầu tiên ... nếu bạn sau đó đặt nó thành "foo" ... trên mỗi lần tải tiếp theo trong cửa sổ đó ... thuộc tính window.name sẽ trả về "foo" ... trừ khi bạn mở liên kết trong tab/cửa sổ mới ... cửa sổ mới sẽ không có tên được đặt.

(tất nhiên trừ khi bạn mở một popup qua window.open (url, tên, tính năng); cho phép bạn đặt trước tên)

<script> 
if(window.name == ''){ 
    //first load (or Nth load in a new Tab/Window) 
    if(!SOME_VALUE_SET_FOR_2ND_TO_NTH_LOADS){ 
    //set name so we can catch new Tab/Window 
    window.name = 'myWinName'; 
    } else { 
    //we have a new Tab/Window (or something funky) 
    alert('What?! One window not cool enough for ya?\n' + 
     'Calling the InterWeb Police!'); 
    } 
} else if(window.name == 'myWinName'){ 
    //2nd-Nth load 
    document.title = 'All is well... we think'; 
} 
</script> 

Hãy cẩn thận:

  • Nếu trang của bạn ban đầu được tải trong cửa sổ/khung hình đã có tên ...Mọi thứ sẽ bị quirky
  • Nếu trang của bạn có iframe và bạn có bất kỳ liên kết nào được nhắm mục tiêu vào iframe đó, có lỗi trong IE7/8 theo đó người dùng mở các liên kết đó trong tab/cửa sổ mới, tab mới/cửa sổ sẽ "kế thừa" tên của khung nội tuyến được nhắm mục tiêu ban đầu (rất lỗi ODD mà không có lỗi nào được mong đợi)
+0

Đây là một thủ thuật gọn gàng :-) Tôi phải tự mình thử nó để xem nó hoạt động. Nếu tôi hiểu điều này đúng, bạn sẽ giả sử bạn có một trang mục nhập cho ứng dụng nơi window.name luôn được giả định là trống - trên mục nhập vào trang đó bạn đặt giá trị đã biết. Trên mọi điều hướng trang khác trong cùng một cửa sổ tab.name được giữ nguyên. Tuy nhiên, nếu bạn mở tab, window.name sẽ bị mất. Tại thời điểm đó, kịch bản lệnh của bạn sẽ kiểm tra nếu window.name không được để trống và vì bạn không ở trên trang đầu tiên của mình, bạn đã phát hiện một tab mới được mở. Rât gọn gang! –

6

Đây là những gì tôi sử dụng trong ASP.NET MVC để cấm người dùng được xác thực mở nhiều tab:

<script language="javascript" type="text/javascript"> 
    @if(Request.IsAuthenticated) 
    { 
     <text> 
     if (window.name != 'singleWindow') { 
      window.location.href = "Content/ErrorPages/SingleTab.htm"; 
     } 
     </text> 
    } 
    else 
    { 
     <text> 
     window.name = "singleWindow"; 
     </text> 
    } 
</script> 

Về cơ bản, điều này đặt tên cửa sổ lần đầu tiên khi người dùng truy cập trang đăng nhập. Sau khi đăng nhập, mỗi trang tiếp theo tải tên cửa sổ sẽ được kiểm tra.

Hai vấn đề:

  • không Wok nếu Javascript tàn tật
  • nếu do nhầm lẫn người dùng đóng tab gốc và sau đó dán một số liên kết khác để trang web của tôi vào thanh địa chỉ, người dùng sẽ luôn nhận được trang lỗi. Để cung cấp cho người dùng cơ hội khôi phục, tôi đã bao gồm liên kết "Đăng xuất" trong trang SingleTab.htm, vì vậy người dùng có thể hủy cookie phiên của mình và bắt đầu một phiên mới.
Các vấn đề liên quan