Apakah klik kanan acara Javascript?

173

Apakah klik kanan acara Javascript? Jika demikian, bagaimana cara menggunakannya?

Brian
sumber

Jawaban:

188

Seperti yang telah disebutkan orang lain, tombol kanan mouse dapat dideteksi melalui peristiwa mouse biasa (mouseous, mouseup, klik) . Namun, jika Anda mencari acara pembakaran ketika menu klik kanan muncul, Anda mencari di tempat yang salah. Menu klik kanan / konteks juga dapat diakses melalui keyboard (shift + F10 atau tombol menu konteks pada Windows dan beberapa Linux). Dalam situasi ini, acara yang Anda cari adalah oncontextmenu:

window.oncontextmenu = function ()
{
    showCustomMenu();
    return false;     // cancel default menu
}

Sedangkan untuk acara mouse sendiri, browser menetapkan properti ke objek acara yang dapat diakses dari fungsi penanganan acara:

document.body.onclick = function (e) {
    var isRightMB;
    e = e || window.event;

    if ("which" in e)  // Gecko (Firefox), WebKit (Safari/Chrome) & Opera
        isRightMB = e.which == 3; 
    else if ("button" in e)  // IE, Opera 
        isRightMB = e.button == 2; 

    alert("Right mouse button " + (isRightMB ? "" : " was not") + "clicked!");
} 

window.oncontextmenu - MDC

Andy E
sumber
5
Sama seperti masalah / tombol mana, 'oncontextmenu' tidak diterapkan sama di semua browser ... lihat quirksmode.org/dom/events/contextmenu.html untuk beberapa 'gotcha'.
smencer
3
@AndyE Hai Andy, ekspresinya (isRightMB?"was not" : "")seharusnya (isRightMB?"was" : "was not"). Baik ? Tolong bantu untuk memeriksanya.
Joe.wang
1
@ Jo: lucu bagaimana itu naik 32 suara dan 4 tahun tanpa ada yang memperhatikan ;-) Saya pikir saya bisa dimaafkan, - saat itu 00:30 ketika saya menulis jawabannya!
Andy E
1
Perlu diingat bahwa pada Mac FF ctrl + klik kanan akan muncul sebagai klik kiri mouse (e.which === 1), sedangkan pada Mac Chrome ctrl + klik kanan akan muncul seperti yang diharapkan klik mouse kanan (e.ctrlKey && e .yang === 3).
ND
8
Di Chrome 59, tombol mouse kanan memicu onmousedowndan onmouseup, tetapi tidak onclick. Ternyata, di Chrome, onclickhanya dipicu untuk tombol kiri-mouse. (dan ya teman-teman, saya menguji ini beberapa kali) Untuk mendeteksi klik kanan mouse, Anda harus menggabungkan onmousedowndan onmouseup, atau menggunakan oncontextmenu.
Venryx
27

lihat kode jQuery berikut:

$("#myId").mousedown(function(ev){
      if(ev.which == 3)
      {
            alert("Right mouse button clicked on element with id myId");
      }
});

Nilai whichakan:

  • 1 untuk tombol kiri
  • 2 untuk tombol tengah
  • 3 untuk tombol kanan
Phil Rykoff
sumber
2
Eeeew, itu mengerikan! Kenapa .whichtidak sama dengan .button? Oo .button=> 0,1,2 ; which=> 1,2,3 . itu salah.
Ben Philipp
11

Anda dapat menggunakan acara tersebut window.oncontextmenu, misalnya:

window.oncontextmenu = function () {
  alert('Right Click')
}
<h1>Please Right Click here!</h1>

Radi Cho
sumber
ini juga menembak kiri mb
Alex
Luar biasa +1, sekarang bagaimana cara saya memblokir menu konteks? @ user12345678
Shayan
2
@Shayan e.preventDefault ()
Brian Allan West
@BrianAllanWest Apakah itu jQuery? Saya tidak tahu bagaimana menggunakannya. window.oncontextmenu = function () { e.preventDefault() }tidak bekerja
Shayan
2
@Shayan, tidak, ini javascript mentah ... Anda akan menggunakannya seperti ini ... window.oncontextmenu = function (e) {e.preventDefault ();} ini mencegah perilaku default browser ketika menu konteks (yaitu: klik kanan mouse atau tahan pada mac) ditekan.
Brian Allan West
6

Ya, meskipun w3c mengatakan klik kanan dapat dideteksi oleh peristiwa klik, onClick tidak dipicu melalui klik kanan di browser biasa.

Bahkan, klik kanan hanya memicu onMouseDown onMouseUp dan onContextMenu.

Dengan demikian, Anda dapat menganggap "onContextMenu" sebagai acara klik kanan. Ini adalah standar HTML5.0.

Eric
sumber
1
Ya, terdengar seperti solusi hebat, terutama jika Anda menargetkan browser yang lebih baru. Saya tidak berpikir ini hanya HTML5.0, karena bahkan IE 5.5 mendukungnya pada elemen! Berikut ini lebih banyak browser yang mendukungnya: quirksmode.org/dom/events/contextmenu.html
Ignas2526
5

Jika Anda ingin mendeteksi klik kanan mouse, Anda tidak boleh menggunakan MouseEvent.whichproperti karena tidak standar dan ada banyak ketidakcocokan di antara browser. (lihat MDN ) Anda sebaiknya menggunakan MouseEvent.button. Ini mengembalikan angka yang mewakili tombol yang diberikan:

  • 0: Tombol utama ditekan, biasanya tombol kiri atau keadaan tidak diinisialisasi
  • 1: Tombol bantu ditekan, biasanya tombol roda atau tombol tengah (jika ada)
  • 2: Tombol sekunder ditekan, biasanya tombol kanan
  • 3: Tombol keempat, biasanya tombol Browser Back
  • 4: Tombol kelima, biasanya tombol Browser Forward

MouseEvent.button menangani lebih banyak tipe input daripada hanya mouse standar:

Tombol dapat dikonfigurasi secara berbeda dengan tata letak standar "kiri ke kanan". Mouse yang dikonfigurasikan untuk penggunaan tangan kiri mungkin memiliki tindakan tombol terbalik. Beberapa perangkat penunjuk hanya memiliki satu tombol dan menggunakan keyboard atau mekanisme input lain untuk mengindikasikan utama, sekunder, tambahan, dll. Lainnya mungkin memiliki banyak tombol yang dipetakan ke berbagai fungsi dan nilai tombol.

Referensi:

  1. https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/which
  2. https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button
AlienKevin
sumber
Berharap ini adalah jawaban pertama yang saya lihat ketika mencari
Gunnar Már Óttarsson
3

Tidak, tetapi Anda dapat mendeteksi tombol mouse apa yang digunakan dalam acara "onmousedown" ... dan dari sana menentukan apakah itu "klik kanan".

Timothy Khouri
sumber
@Brian: klik kanan akan memicu onmousedown, onmouseupdan onclick. Namun, jika Anda ingin mengganti menu klik kanan, acara ini bukan yang seharusnya Anda gunakan (lihat jawaban saya di bawah).
Andy E
2

Kode berikut menggunakan jQuery untuk menghasilkan rightclickacara khusus berdasarkan default mousedowndan mouseupacara. Itu mempertimbangkan hal-hal berikut:

  • pemicu pada mouseup
  • memicu hanya ketika ditekan mousedown pada elemen yang sama sebelumnya
  • kode ini terutama juga berfungsi di JFX Webview (karena contextmenuacara tidak dipicu di sana)
  • itu TIDAK memicu ketika tombol menu konteks pada keyboard ditekan (seperti solusi dengan on('contextmenu', ...)tidak

$(function ()
{ // global rightclick handler - trigger custom event "rightclick"
	var mouseDownElements = [];
	$(document).on('mousedown', '*', function(event)
	{
		if (event.which == 3)
		{
			mouseDownElements.push(this);
		}
	});
	$(document).on('mouseup', '*', function(event)
	{
		if (event.which == 3 && mouseDownElements.indexOf(this) >= 0)
		{
			$(this).trigger('rightclick');
		}
	});
	$(document).on('mouseup', function()
	{
		 mouseDownElements.length = 0;
	});
    // disable contextmenu
    $(document).on('contextmenu', function(event)
	{
		 event.preventDefault();
	});
});



// Usage:
$('#testButton').on('rightclick', function(event)
{
  alert('this was a rightclick');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="testButton">Rightclick me</button>

Frederic Leitenberger
sumber
1

Ya itu!

function doSomething(e) {
    var rightclick;
    if (!e) var e = window.event;
    if (e.which) rightclick = (e.which == 3);
    else if (e.button) rightclick = (e.button == 2);
    alert('Rightclick: ' + rightclick); // true or false
}
ChickenMilkBomb
sumber
Yah - secara teknis ini bukan "acara" tetapi bisa digunakan.
ChickenMilkBomb
@TimothyKhouri (dan siapa pun di sini): ini adalah fungsi pendengar acara yang kompatibel. Anda akan melewatkan objek fungsi itu sendiri sebagai argumen kedua ke addEventListener , yang kemudian akan memanggilnya pada terjadinya peristiwa yang ditentukan. Sebagai contoh:elem.addEventListener("click", doSomething)
John Weisz
1

Ya, oncontextmenu mungkin merupakan alternatif terbaik tetapi perlu diketahui bahwa itu memicu pada mouse ke bawah sedangkan klik akan memicu pada mouse ke atas.

Pertanyaan terkait lainnya adalah tentang klik ganda kanan - yang tampaknya tidak didukung kecuali melalui pemeriksaan timer manual. Salah satu alasan Anda mungkin ingin memiliki klik ganda kanan adalah jika Anda perlu / ingin mendukung input mouse tangan kiri (pembalikan tombol). Implementasi browser tampaknya membuat banyak asumsi tentang bagaimana kita seharusnya menggunakan perangkat input yang tersedia.

phbcanada
sumber
1

Cara termudah untuk menyelesaikan klik kanan adalah menggunakan

 $('classx').on('contextmenu', function (event) {

 });

Namun ini bukan solusi lintas browser, browser berperilaku berbeda untuk acara ini terutama firefox dan IE. Saya akan merekomendasikan di bawah ini untuk solusi lintas browser

$('classx').on('mousedown', function (event) {
    var keycode = ( event.keyCode ? event.keyCode : event.which );
    if (keycode === 3) {
       //your right click code goes here      
    }
});
imal hasaranga perera
sumber
1

Itu adalah cara termudah untuk mengaktifkannya, dan berfungsi di semua browser kecuali tampilan web aplikasi seperti (CefSharp Chromium dll ...). Saya harap kode saya akan membantu Anda dan semoga berhasil!

const contentToRightClick=document.querySelector("div#contentToRightClick");

//const contentToRightClick=window; //If you want to add it into the whole document

contentToRightClick.oncontextmenu=function(e){
  e=(e||window.event);
  e.preventDefault();
  console.log(e);
  
  return false; //Remove it if you want to keep the default contextmenu 
}
div#contentToRightClick{
  background-color: #eee;
  border: 1px solid rgba(0,0,0,.2);
  overflow: hidden;
  padding: 20px;
  height: 150px;
}
<div id="contentToRightClick">Right click on the box !</div>

Adnane Ar
sumber
1

window.oncontextmenu = function (e) {
  e.preventDefault()
  alert('Right Click')
}
<h1>Please Right Click here!</h1>

Opium
sumber
0

Jika Anda ingin memanggil fungsi sementara acara klik kanan berarti kita dapat menggunakan berikut ini

 <html lang="en" oncontextmenu="func(); return false;">
 </html>

<script>
function func(){
alert("Yes");
}
</script>
madhu priya
sumber
0

Ini berhasil dengan saya

if (evt.xa.which == 3) 
{
    alert("Right mouse clicked");
}
Amr Elngm
sumber
0

Cobalah menggunakan whichdan / atau buttonproperti

The demo

function onClick(e) {
  if (e.which === 1 || e.button === 0) {
    console.log('Left mouse button at ' + e.clientX + 'x' + e.clientY);
  }
  if (e.which === 2 || e.button === 1) {
    console.log('Middle mouse button ' + e.clientX + 'x' + e.clientY);
  }
  if (e.which === 3 || e.button === 2) {
    console.log('Right mouse button ' + e.clientX + 'x' + e.clientY);
  }
  if (e.which === 4 || e.button === 3) {
    console.log('Backward mouse button ' + e.clientX + 'x' + e.clientY);
  }
  if (e.which === 5 || e.button === 4) {
    console.log('Forward mouse button ' + e.clientX + 'x' + e.clientY);
  }
}
window.addEventListener("mousedown", onClick);

Beberapa info di sini

F8ER
sumber
-1

Menangani acara menggunakan jQueryperpustakaan

$(window).on("contextmenu", function(e)
{
   alert("Right click");
})
Ilya
sumber
-1

Untuk menangani klik kanan dari mouse, Anda dapat menggunakan acara 'oncontextmenu'. Di bawah ini adalah contohnya:

 document.body.oncontextmenu=function(event) {
     alert(" Right click! ");
 };

kode di atas mengingatkan beberapa teks ketika klik kanan ditekan. Jika Anda tidak ingin menu default browser muncul, Anda dapat menambahkan return false; Di akhir konten fungsi. Terima kasih.

Sayanjyoti Das
sumber
Daripada hanya menanggapi dengan jawaban yang mempromosikan beberapa kerangka kerja, jawaban Anda akan lebih berguna jika berisi solusi vanilla JS, dan kemudian mungkin menjelaskannya untuk menjelaskan bagaimana bisa lebih mudah untuk menggunakan kerangka kerja Anda juga.
Xaniff
Ok ... Terima kasih untuk rekomendasinya .. Ini sebenarnya sangat mudah dengan vanila juga
Sayanjyoti Das
-2

Ya, ini adalah javascript event mousedown. Ada juga plugin jQuery untuk melakukannya

Teja Kantamneni
sumber