Kích hoạt sự kiện onclick bằng cách sử dụng nhấp chuột giữa


90

Tôi đang sử dụng onclicksự kiện của một liên kết được băm để mở <div>một cửa sổ bật lên. Nhưng nhấp chuột giữa không kích hoạt onclicksự kiện mà chỉ lấy hrefgiá trị thuộc tính của liên kết và tải URL trong một trang mới. Làm cách nào để sử dụng nhấp chuột giữa để mở <div>cửa sổ bật lên?


15
Tôi vẫn không hiểu vấn đề được giải quyết như thế nào khi nhấp chuột giữa không kích hoạt sự kiện onclick.
Tomáš Zato - Phục hồi Monica

3
@ TomášZato Trình duyệt không kích hoạt sự kiện 'nhấp chuột' bằng nhấp chuột giữa, nhưng chúng có thể kích hoạt sự kiện 'nhấp chuột lên'. Sau đó, khuôn khổ javascript có thể ràng buộc điều này với một hành động 'nhấp chuột' để làm bạn bối rối. Tôi khuyên bạn nên đọc unixpapa.com/js/mouse.html
rds

Câu trả lời:


64

BIÊN TẬP

Câu trả lời này không được dùng nữa và không hoạt động trên Chrome. Có thể bạn sẽ kết thúc bằng sự kiện auxlink , nhưng hãy tham khảo các câu trả lời khác bên dưới.

/BIÊN TẬP


Câu trả lời của beggs là đúng, nhưng có vẻ như bạn muốn ngăn hành động mặc định của nhấp chuột giữa. Trong trường hợp đó, hãy bao gồm những điều sau

$("#foo").on('click', function(e) {
   if (e.which == 2) {
      e.preventDefault();
      alert("middle button"); 
   }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a id="foo" href="http://example.com">middle click me</a>

PreventDefault () sẽ dừng hành động mặc định của sự kiện.


19
Hãy ghi nhớ rằng .liveđã bị phản đối và loại bỏ ủng hộ.on
Naftali aka Neal

2
Đối với tôi, FF chỉ hoạt động với sự kiện mousedown. Sự kiện nhấp chuột gọi thứ này là scr.hu/1kig/su5c9
l00k

1
Có hằng số trình duyệt chéo nào cho điều đó 2không?
fracz

11
Tính năng này không còn hoạt động trong Chrome 55. Xem 1 , 2câu hỏi này
billc.cn 19/12/16

1
Đây là giải pháp như thế nào khi vấn đề là nhấp chuột giữa không kích hoạt sự kiện nhấp chuột bắt đầu?
Drazen Bjelovuk

31

Để phát hiện nút nhấp chuột giữa / con lăn chuột, bạn phải sử dụng sự kiện auxclick. Ví dụ:

<a href="https://example.com" onauxclick="func()" id="myLink"></a>

Sau đó, trong tệp script của bạn

function func(e) {
  if (e.button == 1) {
    alert("middle button clicked")
  }
}

Nếu bạn muốn làm điều đó từ JavaScript (mà không sử dụng thuộc tính HTML onauxclick), thì bạn addEventListenerđến phần tử:

let myLink = document.getElementById('myLink')
myLink.addEventListener('auxclick', function(e) {
  if (e.button == 1) {
    alert("middle button clicked")
  }
})
<a id="myLink" href="http://example.com">middle click me</a>

Kiểm tra trang mdn về auxclicksự kiện ở đây .


lưu ý: onauxclick sẽ làm việc nhưng nó không mở liên kết trong một tab mới ...
Jonathan Laliberte

2
Đây là câu trả lời duy nhất thực sự hoạt động trong Chrome. Nếu bạn cần sự kiện "nhấp chuột" cho nút chuột phải, bạn có thể sử dụng "contextmenu" (mặc dù nó không chỉ được kích hoạt bằng cách nhấp chuột phải): developer.mozilla.org/en-US/docs/Web/API/Element/…
Humpparitari

1
kết hợp với câu trả lời trên, bạn có thể ngăn chặn việc chụp nhấp chuột phải theo if(event.button==1)mệnh đề, đây là câu trả lời hoạt động duy nhất.
Buddy

Lưu ý rằng bạn cần sử dụng cả auxclicksự kiện và để kiểm tra giá trị của e.button == 1. Tôi đã chỉnh sửa câu trả lời.
Flimm

26

Bạn có thể dùng

event.button

để xác định nút chuột nào đã được nhấp.

Trả về giá trị số nguyên cho biết nút đã thay đổi trạng thái.

  • 0 cho 'nhấp chuột' tiêu chuẩn, thường là nút bên trái
  • 1 cho nút giữa, thường là nhấp chuột
  • 2 cho nút bên phải, thường nhấp chuột phải

Lưu ý rằng quy ước này không được tuân thủ trong Internet Explorer: hãy xem QuirksMode để biết chi tiết.

Thứ tự các nút có thể khác nhau tùy thuộc vào cách thiết bị trỏ đã được cấu hình.

Cũng đọc

Nút chuột nào đã được nhấp vào?

Có hai thuộc tính để tìm ra nút chuột nào đã được nhấp: nút nào và nút nào. Xin lưu ý rằng các thuộc tính này không phải lúc nào cũng hoạt động trên một sự kiện nhấp chuột. Để phát hiện một nút chuột một cách an toàn, bạn phải sử dụng các sự kiện di chuyển xuống hoặc di chuột lên.

document.getElementById('foo').addEventListener('click', function(e) {
  console.log(e.button);
  e.preventDefault();
});
<a id="foo" href="http://example.com">middle click me</a>


4
Tôi khuyên bạn nên sử dụng event.whichvì nó đã được chuẩn hóa trên các trình duyệt trong nguồn jQuery - dòng 2756 -if ( !event.which && event.button ) event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
Russ Cam

2
@RussCam Tuy nhiên, MouseEvent.whichkhông được định nghĩa trong bất kỳ thông số kỹ thuật nào, nhưng MouseEvent.buttonđược định nghĩa trong Sự kiện DOM L2.
Oriol

@Oriol đúng, nhưng được triển khai khác nhau giữa các nhà cung cấp trình duyệt khác nhau. OP đã gắn thẻ câu hỏi bằng jQuery, vì vậy đó là lý do tại sao tôi đề xuất sử dụngevent.which nhưng lẽ ra phải giải thích rằng đó MouseEvent.whichkhông phải là một phần của đặc tả chính thức.
Russ Cam

@rahul, Thế còn chuột chơi game có hơn 7 nút thì sao? egg-tech.com/blog/images/mouse%20buttons.jpg
Pacerier

Trên thực tế, điều này không hoạt động trong các trình duyệt như Firefox hoặc Chrome, chỉ dành cho nhấp chuột chính. Xem 1 , 2câu hỏi này .
Flimm

8

Tôi thường ghét khi mọi người đưa ra các giải pháp thay thế thay vì giải pháp, nhưng vì các giải pháp đã được cung cấp nên tôi sẽ phá vỡ quy tắc của chính mình.

Các trang web mà tính năng nhấp chuột giữa bị ghi đè có xu hướng thực sự gây khó chịu cho tôi. Tôi thường nhấp chuột giữa vì tôi muốn mở nội dung mới trong một tab mới trong khi có một chế độ xem nội dung hiện tại không bị cản trở. Bất cứ lúc nào bạn có thể để riêng chức năng nhấp chuột giữa và cung cấp nội dung có liên quan thông qua thuộc tính HREF của phần tử được nhấp của bạn, tôi thực sự tin rằng đó là điều bạn nên làm.


nhưng điều gì sẽ xảy ra nếu bạn có các tab trên trang web của mình và muốn hoạt động giống như trong trình duyệt của mình? Khi đó, middleclick sẽ đóng một tab hiện có.
cmxl

6

jQuery cung cấp một .which thuộc tính trên sự kiện cung cấp id nút bấm từ trái sang phải là 1, 2, 3. Trong trường hợp này, bạn muốn 2.

Sử dụng:

$("#foo").live('click', function(e) { 
   if( e.which == 2 ) {
      alert("middle button"); 
   }
}); 

Câu trả lời của Adamantium cũng sẽ hoạt động nhưng bạn cần chú ý đến IE như anh ấy lưu ý:

$("#foo").live('click', function(e) { 
   if((!$.browser.msie && e.button == 1) || ($.browser.msie && e.button == 2)) { 
     alert("middle button"); 
   } 
});

Cũng nên nhớ .buttonthuộc tính là 0-indexed chứ không phải 1-indexed like .which.


tôi có thể ghi đè chức năng của trình duyệt mozilla không !! Ví dụ: khi nhấp chuột trái, nó sẽ mở một cửa sổ bật lên .... nhưng đối với nhấp chuột giữa, nó không mở cửa sổ bật lên và một tab mới được mở trong đó cửa sổ bật lên không mở .. vì vậy tôi muốn ghi đè chức năng nhấp chuột giữa của mozilla ....
Sadesh Kumar N

Mozilla có một cài đặt để mở tất cả các cửa sổ bật lên trong một tab mới chứ không phải một cửa sổ mới. Nếu người dùng đã bật tùy chọn này thì tôi không nghĩ bạn có thể làm được gì. Nếu đây không phải là những gì đang xảy ra, bạn có thể đăng một số mã hoặc một liên kết đến trang sự cố không?
beggs

Điều này không hoạt động trong các trình duyệt như Firefox và Chrome.
Flimm

6

Câu hỏi này hơi cũ, nhưng tôi đã tìm ra giải pháp:

$(window).on('mousedown', function(e) {
   if( e.which == 2 ) {
      e.preventDefault();
   }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a href="http://example.com">middle click me</a>

Chrome không kích hoạt sự kiện "nhấp chuột" cho con lăn chuột

Làm việc trong FF và Chrome


Tôi không muốn giả sử trường hợp sử dụng của bạn, nhưng tôi dám cá rằng rất nhiều người sẽ thực sự cần sự kiện 'mouseup'. Nó cũng hoạt động với nút chuột giữa.
Bojidar Stanchev, 09/07/19

Khi tôi thử điều này trong Firefox và Chrome, nó không ngăn hành vi mặc định là mở liên kết trong tab mới, ngay cả khi e.preventDefault()nó được gọi.
Flimm

5

Phương pháp thích hợp là sử dụng .on, như .liveđã không được dùng nữa và sau đó bị xóa khỏi jQuery:

$("#foo").on('click', function(e) { 
   if( e.which == 2 ) {
      e.preventDefault();
      alert("middle button"); 
   }
});

Hoặc nếu bạn muốn cảm giác giống như "trực tiếp" và #fookhông có trên trang của bạn khi bắt đầu tài liệu:

$(document).on('click', '#foo', function(e) { 
   if( e.which == 2 ) {
      e.preventDefault();
      alert("middle button"); 
   }
});

câu trả lời ban đầu


Sự kiện clicknày không hoạt động đối với nút chuột giữa trong các trình duyệt như Firefox và Chrome.
Flimm

nó từng là @Flimm
Naftali aka Neal

Vâng. Stack Overflow không có giải pháp tốt cho các câu trả lời lỗi thời. Tôi sợ mình phải từ chối vì "Câu trả lời này không hữu ích" nữa. Điều tồi tệ hơn là câu trả lời được ghim có thể có hàng trăm hoặc hàng nghìn lượt phản đối vì nó đã lỗi thời và nó sẽ vẫn được ghim mãi mãi nếu OP không phản hồi.
Flimm

Đặt một câu hỏi mới :-) (tham khảo câu hỏi này nói rằng nó đã lỗi thời và bạn muốn có câu trả lời vào năm 2020). Nhưng cũng có thể sử dụng các sự kiện mousedown / mouseup?
Naftali aka Neal

Ngay cả khi tôi làm điều đó, những người như tôi vẫn sẽ bắt gặp câu trả lời này khi đến từ các công cụ tìm kiếm và sẽ bị nhầm lẫn bởi câu trả lời sai được ghim.
Flimm

3

Tôi biết mình đến muộn trong bữa tiệc, nhưng đối với những người vẫn gặp vấn đề với việc xử lý nhấp chuột giữa, hãy kiểm tra xem bạn có ủy quyền sự kiện hay không. Trong trường hợp ủy quyền, clicksự kiện không nổ súng. Đối chiếu:

Điều này hoạt động cho các nhấp chuột giữa:

$('a').on('click', function(){
  console.log('middle click');
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a href="http://example.com">middle click me</a>

Điều này không hoạt động đối với các nhấp chuột giữa:

$('div').on('click', 'a', function(){
  alert('middle click');
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>
  <a href="http://example.com">middle click here</a>
</div>

Nếu bạn vẫn cần theo dõi nhấp chuột giữa bằng cách sử dụng ủy quyền sự kiện , thì cách duy nhất như đã nêu trong vé jQuery tương ứng , là sử dụng mousedownhoặc mouseupthay thế. Như vậy:

Điều này hoạt động đối với các nhấp chuột giữa được ủy quyền:

$('div').on('mouseup', 'a', function(){
  console.log('middle click');
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>
  <a href="http://example.com">middle click me</a>
</div>

Xem trực tuyến tại đây .


Trên thực tế, clickkhông hoạt động đối với các nhấp chuột giữa như trong ví dụ đầu tiên của bạn.
Flimm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.