ทริกเกอร์เหตุการณ์ onclick โดยใช้คลิกกลาง


92

ฉันใช้onclickเหตุการณ์ของลิงก์ที่แฮชเพื่อเปิด<div>เป็นป๊อปอัป แต่การคลิกกลางไม่ได้ทริกเกอร์onclickเหตุการณ์แต่รับเฉพาะhrefค่าแอตทริบิวต์ของลิงก์และโหลด URL ในหน้าใหม่ ฉันจะใช้คลิกกลางเพื่อเปิด<div>เป็นป๊อปอัปได้อย่างไร


15
ฉันยังไม่เข้าใจว่าปัญหาได้รับการแก้ไขอย่างไรเมื่อการคลิกกลางไม่ทำให้เกิดเหตุการณ์ onclick
Tomáš Zato - คืนสถานะ Monica

3
เบราว์เซอร์ @ TomášZatoไม่เริ่มเหตุการณ์ 'คลิก' ด้วยการคลิกกลาง แต่อาจทำให้เกิดเหตุการณ์ 'mouseup' จากนั้นเฟรมเวิร์กจาวาสคริปต์อาจผูกสิ่งนี้เข้ากับการกระทำ 'คลิก' เพื่อทำให้คุณสับสน ขอแนะนำให้อ่านunixpapa.com/js/mouse.html
rds

คำตอบ:


64

แก้ไข

คำตอบนี้เลิกใช้งานแล้วและใช้ไม่ได้กับ Chrome คุณอาจจะใช้เหตุการณ์ auxlinkเป็นส่วนใหญ่แต่โปรดดูคำตอบอื่น ๆ ด้านล่าง

/ แก้ไข


คำตอบของ beggs ถูกต้อง แต่ดูเหมือนว่าคุณต้องการป้องกันการกระทำเริ่มต้นของคลิกกลาง ในกรณีนี้ให้รวมสิ่งต่อไปนี้

$("#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 ()จะหยุดการทำงานเริ่มต้นของเหตุการณ์


19
โปรดทราบว่า.liveมีการเลิกใช้งานและถูกลบออกเพื่อประโยชน์ของ.on
Naftali aka Neal

2
สำหรับฉัน FF ใช้งานได้กับเหตุการณ์ที่มีเมาส์เท่านั้น เหตุการณ์คลิกเรียกสิ่งนี้ว่าscr.hu/1kig/su5c9
l00k

1
มีค่าคงที่ข้ามเบราว์เซอร์2หรือไม่?
fracz

11
สิ่งนี้ใช้ไม่ได้ใน Chrome 55 อีกต่อไปโปรดดู1 , 2และคำถามนี้
billc.cn

1
วิธีนี้มีวิธีแก้ไขอย่างไรเมื่อปัญหาคือคลิกกลางไม่ทำให้เหตุการณ์คลิกเริ่มต้นด้วย
Drazen Bjelovuk

35

สำหรับปุ่มกลางคลิกเมาส์ / auxclickล้อที่จะตรวจพบคุณต้องใช้เหตุการณ์ เช่น:

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

จากนั้นในไฟล์สคริปต์ของคุณ

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

หากคุณต้องการทำจาก JavaScript (โดยไม่ใช้แอตทริบิวต์ HTML onauxclick) ให้คุณaddEventListenerไปที่องค์ประกอบ:

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>

ชำระเงินหน้า MDN เกี่ยวกับauxclickเหตุการณ์ที่นี่


หมายเหตุ: onauxclick จะทำงาน แต่ไม่เปิดลิงค์ในแท็บใหม่ ...
Jonathan Laliberte

2
นี่เป็นคำตอบเดียวที่ใช้งานได้จริงใน Chrome หากคุณต้องการเหตุการณ์ "คลิก" สำหรับปุ่มเมาส์ขวาคุณสามารถใช้ "บริบทเมนู" (แม้ว่าจะไม่เพียงแค่คลิกขวาเท่านั้น): developer.mozilla.org/en-US/docs/Web/API/Element/…
Kankaristo

2
เมื่อรวมกับคำตอบข้างต้นคุณสามารถป้องกันการจับคลิกขวาตามif(event.button==1)ข้อนี่เป็นคำตอบเดียวที่ใช้ได้ผล
บัดดี้

หมายเหตุที่คุณจำเป็นต้องใช้ทั้งเหตุการณ์และเพื่อตรวจสอบค่าของauxclick e.button == 1ฉันแก้ไขคำตอบ
Flimm

26

คุณสามารถใช้ได้

event.button

เพื่อระบุว่าปุ่มเมาส์ใดถูกคลิก

ส่งคืนค่าจำนวนเต็มที่ระบุปุ่มที่เปลี่ยนสถานะ

  • 0 สำหรับ 'คลิก' มาตรฐานมักจะเป็นปุ่มซ้าย
  • 1 สำหรับปุ่มกลางมักจะคลิกล้อ
  • 2 สำหรับปุ่มขวาโดยปกติจะคลิกขวา

โปรดทราบว่าไม่มีการปฏิบัติตามหลักการนี้ใน Internet Explorer: ดู QuirksMode สำหรับรายละเอียด

ลำดับของปุ่มอาจแตกต่างกันไปขึ้นอยู่กับวิธีกำหนดค่าอุปกรณ์ชี้ตำแหน่ง

ยังอ่าน

คลิกเมาส์ปุ่มไหนแล้ว

มีคุณสมบัติสองประการในการค้นหาว่าปุ่มเมาส์ใดถูกคลิก: อันไหนและปุ่ม โปรดทราบว่าคุณสมบัติเหล่านี้ใช้ไม่ได้กับเหตุการณ์การคลิกเสมอไป ในการตรวจจับปุ่มเมาส์อย่างปลอดภัยคุณต้องใช้เหตุการณ์การเลื่อนลงหรือเมาส์อัพ

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
ฉันขอแนะนำให้ใช้event.whichเนื่องจากได้รับการกำหนดมาตรฐานในเบราว์เซอร์ในแหล่งที่มา jQuery - บรรทัด 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 อย่างไรก็ตามMouseEvent.whichไม่ได้กำหนดไว้ในข้อมูลจำเพาะใด ๆ แต่MouseEvent.buttonกำหนดไว้ในเหตุการณ์ DOM L2
Oriol

@Oriol ถูกต้อง แต่ใช้งานแตกต่างกันในผู้จำหน่ายเบราว์เซอร์ต่างๆ OP ติดแท็กคำถามด้วย jQuery ดังนั้นฉันจึงแนะนำให้ใช้event.whichแต่ควรมีรายละเอียดที่MouseEvent.whichไม่ได้เป็นส่วนหนึ่งของข้อกำหนดอย่างเป็นทางการ
Russ Cam

@rahul แล้วเกมเมอร์ที่มีปุ่มมากกว่า 7 ปุ่มล่ะ? egg-tech.com/blog/images/mouse%20buttons.jpg
Pacerier

อันที่จริงสิ่งนี้ใช้ไม่ได้ในเบราว์เซอร์เช่น Firefox หรือ Chrome สำหรับการคลิกหลักเท่านั้น ดู1 , 2และคำถามนี้
Flimm

8

ฉันมักจะเกลียดเวลาที่มีคนเสนอทางเลือกแทนวิธีแก้ปัญหา แต่เนื่องจากมีวิธีแก้ปัญหาแล้วฉันจะทำลายกฎของตัวเอง

เว็บไซต์ที่มีการลบล้างคุณลักษณะคลิกกลางมักจะทำให้ฉันติดขัดจริงๆ ฉันมักจะคลิกตรงกลางเพราะต้องการเปิดเนื้อหาใหม่ในแท็บใหม่ในขณะที่มีมุมมองที่ไม่มีสิ่งกีดขวางของเนื้อหาปัจจุบัน เมื่อใดก็ตามที่คุณสามารถออกจากฟังก์ชันคลิกกลางเพียงอย่างเดียวและทำให้เนื้อหาที่เกี่ยวข้องพร้อมใช้งานผ่านแอตทริบิวต์ HREF ขององค์ประกอบที่คุณคลิกฉันเชื่ออย่างยิ่งว่านั่นคือสิ่งที่คุณควรทำ


1
แต่จะเกิดอะไรขึ้นถ้าคุณมีแท็บบนหน้าเว็บของคุณและต้องการให้ทำงานเหมือนกับในเบราว์เซอร์ของคุณล่ะ? คลิกตรงกลางควรปิดแท็บที่มีอยู่แล้ว
cmxl

7

คำถามนี้เก่าไปหน่อย แต่ฉันพบวิธีแก้ไข:

$(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 ไม่เริ่มเหตุการณ์ "คลิก" สำหรับวงล้อเมาส์

ทำงานใน FF และ Chrome


ฉันไม่ต้องการถือว่ากรณีการใช้งานของคุณ แต่ฉันจะพนันด้วยเงินผู้คนจำนวนมากจะต้องใช้เหตุการณ์ 'mouseup' แทน ใช้งานได้กับปุ่มกลางของเมาส์เช่นกัน
Bojidar Stanchev

เมื่อฉันลองสิ่งนี้ใน Firefox และ Chrome มันไม่ได้ป้องกันพฤติกรรมเริ่มต้นของการเปิดลิงก์ในแท็บใหม่แม้ว่าe.preventDefault()จะเรียกว่า
Flimm

6

jQuery มี.whichแอตทริบิวต์ในเหตุการณ์ที่ให้รหัสปุ่มคลิกจากซ้ายไปขวาเป็น 1, 2, 3 ในกรณีนี้คุณต้องการ 2

การใช้งาน:

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

คำตอบของ Adamantium ก็ใช้ได้เช่นกัน แต่คุณต้องระวัง IE ในขณะที่เขาบันทึก:

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

ยังจำ.buttonแอตทริบิวต์ 0 การจัดทำดัชนีไม่ได้ 1 .whichการจัดทำดัชนีเช่น


ฉันสามารถลบล้างการทำงานของเบราว์เซอร์ mozilla ได้ไหม !! เช่นเมื่อคลิกซ้ายมันจะเปิดป๊อปอัป .... แต่สำหรับการคลิกตรงกลางจะไม่เปิดป๊อปอัปและแท็บใหม่จะเปิดขึ้นซึ่งป๊อปอัปไม่ได้เปิดขึ้น .. ดังนั้นฉันต้องการแทนที่ฟังก์ชันคลิกกลางของ mozilla ....
Sadesh Kumar N

Mozilla มีการตั้งค่าเพื่อเปิดป๊อปอัปทั้งหมดในแท็บใหม่แทนที่จะเป็นหน้าต่างใหม่ หากผู้ใช้เปิดใช้งานตัวเลือกนี้ฉันไม่คิดว่าจะมีอะไรให้คุณทำได้ หากนี่ไม่ใช่สิ่งที่เกิดขึ้นคุณสามารถโพสต์รหัสหรือลิงก์ไปยังหน้าปัญหาได้หรือไม่?
ขอทาน

สิ่งนี้ใช้ไม่ได้ในเบราว์เซอร์เช่น Firefox และ Chrome
Flimm

5

วิธีการที่เหมาะสมคือการใช้.onตามที่.liveเลิกใช้งานแล้วลบออกจาก jQuery:

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

หรือถ้าคุณต้องการความรู้สึกเหมือน "สด" และ#fooไม่อยู่ในหน้าของคุณเมื่อเริ่มต้นเอกสาร:

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

คำตอบเดิม


เหตุการณ์clickนี้ใช้ไม่ได้กับปุ่มกลางของเมาส์ในเบราว์เซอร์เช่น Firefox และ Chrome
Flimm

มันเคยเป็น @Flimm
Naftali aka Neal

ใช่. Stack Overflow ไม่มีทางออกที่ดีสำหรับคำตอบที่ล้าสมัย ฉันกลัวว่าจะต้องโหวตลดเพราะ "คำตอบนี้ไม่มีประโยชน์" อีกต่อไป สิ่งที่แย่ไปกว่านั้นคือคำตอบที่ตรึงไว้อาจมีการโหวตลงได้หลายร้อยหรือหลายพันครั้งเนื่องจากไม่เป็นปัจจุบันและจะยังคงตรึงไว้ตลอดไปหาก OP ไม่ตอบสนอง
Flimm

ถามคำถามใหม่ :-) (อ้างอิงคำถามนี้ว่าล้าสมัยและคุณต้องการคำตอบในปี 2020) แต่ยังสามารถใช้เหตุการณ์ mousedown / mouseup ได้หรือไม่?
Naftali aka Neal

แม้ว่าฉันจะทำอย่างนั้น แต่คนอย่างฉันก็ยังคงเจอคำตอบนี้เมื่อมาจากเครื่องมือค้นหาและจะสับสนกับคำตอบที่ตรึงไว้
Flimm

3

ฉันรู้ว่าฉันมาสายปาร์ตี้ แต่สำหรับผู้ที่ยังมีปัญหาในการจัดการคลิกกลางโปรดตรวจสอบว่าคุณมอบหมายงานหรือไม่ ในกรณีของการมอบหมายclickงานจะไม่เริ่มทำงาน เปรียบเทียบ:

ใช้ได้กับคลิกกลาง:

$('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>

สิ่งนี้ใช้ไม่ได้กับการคลิกกลาง:

$('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>

หากคุณยังต้องการติดตามการคลิกกลางโดยใช้การมอบหมายเหตุการณ์วิธีเดียวที่ระบุไว้ในตั๋ว jQuery ที่เกี่ยวข้องคือการใช้mousedownหรือmouseupแทน ชอบมาก:

สิ่งนี้ใช้ได้กับการคลิกตรงกลางที่ได้รับมอบหมาย:

$('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>

ดูออนไลน์ได้ที่นี่


อันที่จริงclickไม่สามารถใช้ได้กับคลิกกลางเหมือนในตัวอย่างแรกของคุณ
Flimm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.