2011-12-01 28 views
6

Hầu hết các trình duyệt hiện đại đều hỗ trợ các lệnh ctrl+click hoặc command+click hoặc tương tự với liên kết mở trong tab mới hoặc cửa sổ mới.Xác định onclick xem liên kết được nhấp có nghĩa là mở cửa sổ hoặc tab mới

Trong một ứng dụng, tôi muốn liên kết bị tắt khi nhấp vào. Nhưng chỉ, nếu mục tiêu là cùng một cửa sổ (nếu nó, ví dụ, mở trong một tab mới, tôi không muốn các liên kết để trở thành vô hiệu hóa vì nó là hợp lý để nhấp vào nó một lần nữa).

Tôi đã thực hiện một số lần thử và gỡ lỗi đối tượng sự kiện được tạo khi nhấp - nhưng tôi không thể tìm thấy bất kỳ thông tin nào về việc liệu mục tiêu đó là tab mới hay cửa sổ mới.

Giải pháp thay thế đã biết: Chắc chắn có thể kiểm tra xem một phím nào đó đã được nhấn trong khi nhấp vào liên kết cụ thể hay không, nhưng vì các lệnh này khác nhau từ trình duyệt đến trình duyệt và từ OS đến OS, một bản đồ phức tạp và những người nows chính xác những gì người dùng đã cấu hình và như vậy.

Có cách nào đáng tin cậy để xác định xem vị trí có nên được mở trong tab hoặc cửa sổ mới không?

Trả lời

3

Ở đây bạn có một ví dụ làm việc: http://jsfiddle.net/pioul/eCuNU/4/

Kịch bản này sẽ cho phép nhấp chuột vào liên kết chỉ khi liên kết sẽ mở trong một tab/cửa sổ mới, dựa trên các thuộc tính target="_blank".

HTML:

<a href="http://google.fr" target="_blank">new window</a> 
<a href="http://google.fr" target="_self">same window 1</a> 
<a href="http://google.fr" target="">same window 2</a> 

jQuery:

$("a").bind("click", function(e){ 
    if($(this).attr("target") != "_blank"){ 
     e.preventDefault(); 
    } 
}); 

EDIT:

Bạn có thể đưa vào ctrl tài khoản + nhấp chuột như thế này:

$("a").bind("click", function(e){ 
    if($(this).attr("target") != "_blank"){ 
     if(!e.ctrlKey){ 
      e.preventDefault(); 
     } 
    } 
}); 
+1

Vâng, điều này chỉ hoạt động với thuộc tính mục tiêu cố định. Nếu người dùng "ghi đè" điều này bằng cách giữ ctrl (hoặc tương tự), thuộc tính sẽ không thay đổi tất nhiên và do đó việc xác định không thành công. – Remo

+1

Tôi đã chỉnh sửa câu trả lời cho phù hợp với trường hợp bạn nói, và tôi đoán không có giải pháp nào khác ngoài việc nghĩ về mọi cách người dùng có thể mở liên kết trong cửa sổ mới và cố gắng phát hiện nó trong mã của bạn. – Pioul

0

Một số lần nó được thiết lập bởi cài đặt trình duyệt để mở liên kết trong tab mới hoặc trong cùng một cửa sổ.

Bạn có thể kiểm tra thuộc tính đích của đối tượng liên kết.

<a href="http://your_link_to_page" target="_blank" >This open in new window</a> 

Sử dụng javascript để thao tác các thẻ neo khi tải trang và kiểm tra các thuộc tính đích. Nếu giá trị mục tiêu được đặt thành _blank thì hãy bật chúng hoặc bạn có thể thực hiện kiểm tra này khi người dùng nhấp vào liên kết.

Bạn có thể sử dụng cơ chế để tìm CTRL được nhấn khi liên kết được nhấp. Có một số tài nguyên như this. Bạn có thể xây dựng một hệ thống.

NOte: nếu bạn đang sử dụng JQuery, hãy sử dụng các lớp khác nhau để phân loại các liên kết phải được kiểm tra. Và vô hiệu hóa chúng trên trạng thái sẵn sàng hoặc tại thời điểm các liên kết được nhấp vào.

+0

Thật không may, điều này vẫn không áp dụng nếu người dùng buộc một tab mới bằng cách giữ 'ctrl', phải không? – Remo

+0

Bạn phải phát hiện đầu tiên phím nào được nhấn khi sự kiện chuột rơi xảy ra. Việc kiểm tra này phải được thực hiện trong phạm vi toàn cầu (ví dụ, trong phạm vi trang). đặt biến jS dựa trên nhấn phím. Sau đó, thực hiện phần còn lại của việc kiểm tra bên trong sự kiện nhấp chuột. –

0

Bạn không thể ngăn trình duyệt mở liên kết trong tab hoặc cửa sổ mới. Có thể có các cài đặt cấu hình (không phát hiện được) mà ép buộc hoặc suy nghĩ về cử chỉ của chuột: Klick phải và di chuyển xuống sẽ mở một tab mới trong Opera và tôi đoán điều này là không thể phát hiện được.

Ngoài ra, buộc trình duyệt mở tab trong cửa sổ mới (target="_blank" hoặc thậm chí window.open) được coi là kiểu xấu. Bạn nên cho phép người dùng chọn những gì anh ấy muốn làm. Nếu bạn thực sự muốn làm, bạn cũng có thể xem xét window.onunload mà nên làm việc nhiều lần nhất.

+0

Vâng, nó không phải là về ngăn chặn hoặc buộc bất cứ điều gì cả - đó là về ** phát hiện ** liệu liên kết sẽ mở trong một cửa sổ mới hay không - đó là tất cả. – Remo

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