Memicu acara onclick menggunakan klik tengah

90

Saya menggunakan onclickacara link hash untuk membuka <div>sebagai pop up. Tetapi klik tengah tidak memicu onclickperistiwa tetapi hanya mengambil nilai hrefatribut dari link dan memuat URL di halaman baru. Bagaimana cara menggunakan klik tengah untuk membuka <div>sebagai popup?

Sadesh Kumar N
sumber
15
Saya masih tidak mengerti bagaimana masalah ini diselesaikan, ketika klik tengah tidak memicu peristiwa onclick.
Tomáš Zato - Kembalikan Monica
3
@ TomášZato Browser tidak mengaktifkan peristiwa 'klik' dengan klik tengah, tetapi browser mungkin mengaktifkan peristiwa 'mouseup'. Kemudian kerangka kerja javascript mungkin mengikat ini ke tindakan 'klik' untuk membingungkan Anda. Saya merekomendasikan pembacaan unixpapa.com/js/mouse.html
rds

Jawaban:

64

EDIT

Jawaban ini sudah tidak digunakan lagi dan tidak berfungsi di Chrome. Anda kemungkinan besar akan berakhir menggunakan acara auxlink , tetapi silakan merujuk ke jawaban lain di bawah ini.

/ EDIT


jawaban beggs benar, tapi sepertinya Anda ingin mencegah aksi default dari klik tengah. Dalam hal ini, sertakan yang berikut ini

$("#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 () akan menghentikan tindakan default acara.

Gausie
sumber
19
Perlu diingat bahwa .liveitu tidak digunakan lagi dan dihapus demi.on
Naftali alias Neal
2
Bagi saya FF hanya bekerja dengan acara mousedown. Acara klik menyebut hal ini scr.hu/1kig/su5c9
l00k
1
Apakah ada konstanta lintas-browser untuk itu 2?
fracz
11
Ini tidak lagi berfungsi di Chrome 55. Lihat 1 , 2 dan pertanyaan ini
billc.cn
1
Bagaimana solusi ini jika masalahnya adalah klik tengah tidak memicu peristiwa klik untuk memulai?
Drazen Bjelovuk
32

Agar tombol klik tengah / roda mouse terdeteksi, Anda harus menggunakan acara tersebut auxclick. Misalnya:

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

Kemudian di file script Anda

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

Jika Anda ingin melakukannya dari JavaScript (tanpa menggunakan atribut HTML onauxclick), maka Anda addEventListenerke elemen:

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>

Lihat halaman mdn tentang auxclickacara di sini .

Hassan
sumber
catatan: onauxclick akan berfungsi tetapi tidak membuka tautan di tab baru ...
Jonathan Laliberte
2
Ini adalah satu-satunya jawaban yang benar-benar berfungsi di Chrome. Jika Anda memerlukan peristiwa "klik" untuk tombol kanan mouse, Anda dapat menggunakan "menu konteks" (meskipun tidak hanya diaktifkan dengan klik kanan): developer.mozilla.org/en-US/docs/Web/API/Element/…
Humpparitari
1
menggabungkan dengan jawaban di atas, Anda dapat mencegah penangkapan klik kanan dengan if(event.button==1)klausa, ini adalah satu-satunya jawaban yang berfungsi.
Buddy
Perhatikan bahwa Anda perlu menggunakan auxclickacara tersebut, dan untuk memeriksa nilai e.button == 1. Saya mengedit jawabannya.
Flimm
26

Kamu bisa memakai

event.button

untuk mengidentifikasi tombol mouse mana yang diklik.

Mengembalikan nilai integer yang menunjukkan tombol yang mengubah status.

  • 0 untuk 'klik' standar, biasanya tombol kiri
  • 1 untuk tombol tengah, biasanya klik roda
  • 2 untuk tombol kanan, biasanya klik kanan

Perhatikan bahwa konvensi ini tidak diikuti di Internet Explorer: lihat QuirksMode untuk detailnya.

Urutan tombol mungkin berbeda tergantung pada bagaimana perangkat penunjuk telah dikonfigurasi.

Baca juga

Tombol mouse mana yang telah diklik?

Ada dua properti untuk mengetahui tombol mouse mana yang telah diklik: yang mana dan tombol. Harap diperhatikan bahwa properti ini tidak selalu berfungsi pada acara klik. Untuk mendeteksi tombol mouse dengan aman, Anda harus menggunakan peristiwa mousedown atau mouseup.

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

rahul
sumber
4
Saya akan merekomendasikan penggunaan event.whichkarena telah distandarisasi di seluruh browser di sumber jQuery - baris 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 Namun, MouseEvent.whichtidak ditentukan dalam spesifikasi apa pun, tetapi MouseEvent.buttonditentukan dalam Peristiwa DOM L2.
Oriol
@Oriol benar, tetapi diterapkan secara berbeda di berbagai vendor browser. OP menandai pertanyaan dengan jQuery, jadi itulah mengapa saya menyarankan untuk menggunakan event.whichtetapi seharusnya menguraikan itu MouseEvent.whichbukan bagian dari spesifikasi resmi.
Russ Cam
@rahul, Bagaimana dengan mouse gaming dengan lebih dari 7 tombol? egg-tech.com/blog/images/mouse%20buttons.jpg
Pacerier
Sebenarnya, ini tidak berfungsi di browser seperti Firefox atau Chrome, hanya untuk klik utama. Lihat 1 , 2 dan pertanyaan ini .
Flimm
8

Saya biasanya benci ketika orang menawarkan alternatif daripada solusi, tetapi karena solusi telah disediakan, saya akan melanggar aturan saya sendiri.

Situs web di mana fitur klik tengah diganti cenderung benar-benar mengganggu saya. Saya biasanya mengklik tengah karena saya ingin membuka konten baru di tab baru sambil melihat konten saat ini tanpa halangan. Kapan pun Anda dapat membiarkan fungsionalitas klik tengah sendiri dan membuat konten yang relevan tersedia melalui atribut HREF dari elemen yang Anda klik, saya sangat yakin itulah yang harus Anda lakukan.

Tom Haflinger
sumber
1
tetapi bagaimana jika Anda memiliki tab di laman web Anda dan menginginkan perilaku yang sama seperti di peramban Anda? middleclick harus menutup tab yang ada.
cmxl
6

jQuery menyediakan .whichatribut pada acara yang memberikan id tombol klik dari kiri ke kanan sebagai 1, 2, 3. Dalam hal ini Anda menginginkan 2.

Pemakaian:

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

Jawaban Adamantium juga akan berfungsi tetapi Anda perlu berhati-hati terhadap IE saat dia mencatat:

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

Ingat juga .buttonatributnya adalah 0-indexed bukan 1-indexed like .which.

beggs
sumber
dapatkah saya mengesampingkan fungsionalitas peramban mozilla !! misalnya pada klik kiri itu membuka pop up .... tetapi untuk klik tengah itu tidak membuka pop up dan tab baru terbuka di mana pop up tidak terbuka .. jadi saya ingin menimpa fungsi klik tengah dari mozilla ....
Sadesh Kumar N
Mozilla memiliki pengaturan untuk membuka semua popup di tab baru, bukan di jendela baru. Jika pengguna memiliki pilihan ini diaktifkan maka saya tidak berpikir ada sesuatu yang dapat Anda lakukan. Jika bukan ini yang terjadi, dapatkah Anda memposting beberapa kode atau tautan ke halaman masalah?
Beggs
Ini tidak berfungsi di browser seperti Firefox dan Chrome.
Flimm
6

Pertanyaan ini agak tua, tetapi saya menemukan solusi:

$(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 tidak mengaktifkan peristiwa "klik" untuk roda mouse

Bekerja di FF dan Chrome

Bastien Bast Weber
sumber
Saya tidak ingin menganggap kasus penggunaan Anda, tetapi saya berani bertaruh banyak orang yang benar-benar membutuhkan acara 'mouseup' sebagai gantinya. Ini juga berfungsi dengan tombol tengah mouse.
Bojidar Stanchev
Ketika saya mencoba ini di Firefox dan Chrome, itu tidak mencegah perilaku default membuka tautan di tab baru, meskipun e.preventDefault()dipanggil.
Flimm
5

Metode yang tepat adalah dengan menggunakan .on, seperti yang .livesudah tidak digunakan lagi dan kemudian dihapus dari jQuery:

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

Atau jika Anda ingin nuansa "hidup" dan #footidak ada di halaman Anda di awal dokumen:

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

jawaban asli

Naftali alias Neal
sumber
Acara clicktidak berfungsi untuk tombol tengah mouse di browser seperti Firefox dan Chrome.
Flimm
dulu @Flimm
Naftali alias Neal
Ya. Stack Overflow tidak memiliki solusi yang baik untuk jawaban yang sudah kadaluwarsa. Saya khawatir saya harus memberi suara negatif karena "Jawaban ini tidak berguna" lagi. Yang lebih buruk adalah bahwa jawaban yang disematkan dapat memiliki ratusan atau ribuan suara negatif karena sudah kedaluwarsa, dan akan tetap disematkan selamanya jika OP tidak merespons.
Flimm
Ajukan pertanyaan baru :-) (rujuk pertanyaan ini dengan mengatakan ini sudah usang dan Anda menginginkan jawaban tahun 2020). Tetapi juga dapat menggunakan acara mousedown / mouseup mungkin?
Naftali alias Neal
Bahkan jika saya melakukan itu, orang-orang seperti saya masih akan menemukan jawaban ini ketika datang dari mesin pencari, dan akan dibuat bingung dengan jawaban yang salah.
Flimm
3

Saya tahu saya terlambat ke pesta, tetapi bagi mereka yang masih mengalami masalah dengan penanganan klik tengah, periksa apakah Anda mendelegasikan acara tersebut. Dalam kasus pendelegasian, clickacara tidak terpicu. Membandingkan:

Ini berfungsi untuk klik tengah:

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

Ini tidak berfungsi untuk klik tengah:

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

Jika Anda masih perlu melacak klik tengah menggunakan delegasi acara , satu-satunya cara seperti yang dinyatakan dalam tiket jQuery terkait , adalah dengan menggunakanmousedown ataumouseup sebagai gantinya. Seperti:

Ini berfungsi untuk klik tengah yang didelegasikan:

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

Lihat secara online di sini .

skip405
sumber
Sebenarnya, clicktidak berfungsi untuk klik tengah seperti pada contoh pertama Anda.
Flimm