คลิกขวาที่เหตุการณ์ Javascript หรือไม่


173

คลิกขวาที่เหตุการณ์ Javascript หรือไม่ ถ้าเป็นเช่นนั้นฉันจะใช้มันได้อย่างไร

คำตอบ:


188

เป็นคนอื่นได้กล่าวถึงปุ่มเมาส์ขวาสามารถตรวจพบได้ผ่านเหตุการณ์ของเมาส์ปกติ (mousedown, mouseup คลิก) อย่างไรก็ตามหากคุณกำลังมองหาเหตุการณ์ยิงเมื่อเมนูคลิกขวาปรากฏขึ้นคุณกำลังมองหาสถานที่ที่ไม่ถูกต้อง เมนูคลิกขวา / บริบทสามารถเข้าถึงได้ผ่านทางแป้นพิมพ์ (Shift + F10 หรือปุ่มเมนูบริบทบน Windows และ Linux บางตัว) ในสถานการณ์นี้เหตุการณ์ที่คุณกำลังค้นหาคือoncontextmenu:

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

สำหรับเหตุการณ์เมาส์เองเบราว์เซอร์ตั้งค่าคุณสมบัติเป็นวัตถุเหตุการณ์ที่สามารถเข้าถึงได้จากฟังก์ชั่นการจัดการเหตุการณ์:

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


5
เช่นเดียวกับปัญหาปุ่ม / ปุ่ม 'oncontextmenu' ไม่ได้ใช้งานเหมือนกันในทุกเบราว์เซอร์ ... ดูquirksmode.org/dom/events/contextmenu.htmlสำหรับบางส่วนของ 'gotchas'
ฆ่า Sm

3
@AndyE Hi แอนดี้แสดงออกควรจะเป็น(isRightMB?"was not" : "") (isRightMB?"was" : "was not")ใช่มั้ย กรุณาช่วยตรวจสอบมัน
Joe.wang

1
@ โจ: ตลกว่ามันเป็น 32 คะแนนโหวตและ 4 ปีโดยไม่มีใครสังเกตเห็น ;-) ฉันคิดว่าฉันสามารถแก้ตัวได้ - 00:30 น. เมื่อฉันเขียนคำตอบ!
Andy E

1
โปรดทราบว่าใน Mac FF ctrl + rightclickจะผ่านมาด้วยการคลิกเมาส์ซ้าย (e.which === 1) ในขณะที่บน Mac Chrome ctrl + rightclickจะผ่านตามการคลิกเมาส์ขวาที่คาดหวัง (e.ctrlKey && e . ซึ่ง === 3)
ND

8
ใน Chrome 59 ปุ่มขวาของเมาส์จะเรียกใช้onmousedownและonmouseupไม่onclickทำงาน เห็นได้ชัดว่าใน Chrome onclickจะถูกเรียกใช้เฉพาะกับปุ่มซ้ายเมาส์ (และใช่ครับผมทดสอบนี้หลายครั้ง) สำหรับการตรวจจับเมาส์ขวาคลิกคุณมีทั้งรวมonmousedownและหรือการใช้งานonmouseup oncontextmenu
Venryx

27

ดูรหัส jQuery ต่อไปนี้:

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

ค่าของwhichจะเป็น:

  • 1สำหรับปุ่มซ้าย
  • 2สำหรับปุ่มกลาง
  • 3สำหรับปุ่มขวา

2
Eeeew มันแย่มาก! เพราะเหตุใดจึง.whichไม่เหมือนกัน.button? Oo .button=> 0,1,2 ; which=> 1,2,3 นั่นเป็นเพียงความผิด
เบ็นฟิลิปป์

11

คุณสามารถใช้เหตุการณ์window.oncontextmenuตัวอย่างเช่น:

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


นี่ยังทำให้ไฟเหลือ mb
อเล็กซ์

+1 ที่ยอดเยี่ยมตอนนี้ฉันจะบล็อกเมนูบริบทได้อย่างไร @ user12345678
Shayan

2
@Shayan e.preventDefault ()
Brian Allan West

@BrianAllanWest jQuery นั้นคืออะไร? ฉันไม่รู้วิธีใช้สิ่งนั้น window.oncontextmenu = function () { e.preventDefault() }ไม่ทำงาน
Shayan

2
@Shayan ไม่มี javascript แบบดิบ ... คุณจะใช้แบบนี้ ... window.oncontextmenu = function (e) {e.preventDefault ();} สิ่งนี้จะป้องกันพฤติกรรมเริ่มต้นของเบราว์เซอร์เมื่อเมนูบริบท (เช่น: คลิกเมาส์ขวาหรือกดค้างบน mac)
Brian Allan West

6

ใช่แม้ว่า w3c กล่าวว่าการคลิกขวาสามารถตรวจพบได้โดยการคลิกเหตุการณ์ onClick จะไม่ถูกเรียกผ่านการคลิกขวาในเบราว์เซอร์ปกติ

ในความเป็นจริงคลิกขวาเท่านั้นเรียก onMouseDown onMouseUp และ onContextMenu

ดังนั้นคุณสามารถพิจารณา "onContextMenu" เป็นเหตุการณ์คลิกขวา มันเป็นมาตรฐาน HTML5.0


1
ใช่ดูเหมือนโซลูชันที่ยอดเยี่ยมโดยเฉพาะถ้าคุณกำหนดเป้าหมายเบราว์เซอร์ใหม่ ฉันไม่คิดว่านี่เป็น HTML5.0 เท่านั้นเพราะแม้แต่ IE 5.5 ก็รองรับในองค์ประกอบ! นี่คือเบราว์เซอร์ที่สนับสนุนเพิ่มเติม: quirksmode.org/dom/events/contextmenu.html
Ignas2526

5

หากคุณต้องการตรวจสอบการคลิกเมาส์ขวาคุณไม่ควรใช้MouseEvent.whichพร็อพเพอร์ตี้เนื่องจากไม่ได้มาตรฐานและมีความไม่ลงรอยกันระหว่างเบราว์เซอร์ขนาดใหญ่ (ดูMDN ) MouseEvent.buttonแทนคุณควรใช้ มันจะคืนค่าตัวเลขแทนปุ่มที่กำหนด:

  • 0: กดปุ่มหลักโดยปกติแล้วจะเป็นปุ่มซ้ายหรือสถานะที่ไม่ได้กำหนดค่าเริ่มต้น
  • 1: กดปุ่มเสริมโดยปกติจะเป็นปุ่มล้อหรือปุ่มกลาง (ถ้ามี)
  • 2: กดปุ่มรองโดยปกติแล้วจะเป็นปุ่มขวา
  • 3: ปุ่มที่สี่โดยทั่วไปจะเป็นปุ่ม Back Browser
  • 4: ปุ่มที่ห้าโดยทั่วไปคือปุ่มส่งต่อเบราว์เซอร์

MouseEvent.button จัดการประเภทอินพุตมากกว่าเมาส์มาตรฐาน:

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

อ้างอิง:

  1. https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/which
  2. https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button

หวังว่านี่จะเป็นคำตอบแรกที่ฉันเห็นเมื่อทำการค้นหา
Gunnar MárÓttarsson

3

ไม่ แต่คุณสามารถตรวจสอบได้ว่ามีการใช้ปุ่มเมาส์ใดในเหตุการณ์ "onmousedown" ... และจากนั้นตรวจสอบว่าเป็น "คลิกขวา" หรือไม่


@ Brian: คลิกขวาจะเรียกonmousedown, และonmouseup onclickหากคุณกำลังดูที่เอาชนะเมนูคลิกขวาเหตุการณ์เหล่านี้ไม่ใช่สิ่งที่คุณควรใช้ (ดูคำตอบของฉันด้านล่าง)
Andy E

2

รหัสต่อไปนี้ใช้ jQuery เพื่อสร้างrightclickเหตุการณ์ที่กำหนดเองตามค่าเริ่มต้นmousedownและmouseupเหตุการณ์ จะพิจารณาประเด็นต่อไปนี้:

  • เปิดเม้าส์
  • ทริกเกอร์เฉพาะเมื่อกด mousedown ในองค์ประกอบเดียวกันก่อน
  • รหัสนี้โดยเฉพาะอย่างยิ่งยังทำงานใน JFX Webview (เนื่องจากcontextmenuเหตุการณ์ไม่ได้ถูกเรียกที่นั่น)
  • มันไม่ได้เรียกเมื่อคีย์ ContextMenu บนแป้นพิมพ์กด (เช่นการแก้ปัญหาที่มีon('contextmenu', ...)ไม่

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


1

ใช่แล้ว!

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

@ TimothyKhouri (และคนอื่น ๆ ที่นี่): นี่เป็นฟังก์ชั่นฟังเหตุการณ์ที่เข้ากันได้ คุณจะส่งผ่านฟังก์ชั่นวัตถุตัวเองเป็นอาร์กิวเมนต์ที่สองเพื่อaddEventListenerซึ่งจะเรียกมันในการเกิดเหตุการณ์ที่ระบุ ตัวอย่างเช่น:elem.addEventListener("click", doSomething)
John Weisz

1

ใช่ oncontextmenu น่าจะเป็นทางเลือกที่ดีที่สุด แต่ระวังว่ามันทำให้เกิดการคลิกเมาส์ขณะที่การคลิกจะทำให้เกิดการเลื่อนขึ้น

คำถามที่เกี่ยวข้องอื่น ๆ ถูกถามเกี่ยวกับการคลิกสองครั้ง - ซึ่งเห็นได้ชัดว่าไม่ได้รับการสนับสนุนยกเว้นผ่านการตรวจสอบการจับเวลาด้วยตนเอง เหตุผลหนึ่งที่คุณอาจต้องการดับเบิลคลิกขวาคือถ้าคุณต้องการ / ต้องการสนับสนุนการป้อนข้อมูลด้วยเมาส์ซ้าย (การสลับปุ่ม) การใช้งานเบราว์เซอร์ดูเหมือนจะทำให้สมมติฐานมากมายเกี่ยวกับวิธีที่เราควรใช้อุปกรณ์อินพุตที่มีอยู่


1

วิธีที่ง่ายที่สุดในการทำให้การคลิกขวาเสร็จสิ้นนั้นใช้

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

 });

อย่างไรก็ตามนี่ไม่ใช่การแก้ปัญหาข้ามเบราว์เซอร์เบราว์เซอร์ทำงานแตกต่างกันไปสำหรับเหตุการณ์นี้โดยเฉพาะ firefox และ IE ฉันจะแนะนำด้านล่างสำหรับโซลูชันเบราว์เซอร์ข้าม

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

1

นั่นเป็นวิธีที่ง่ายที่สุดในการเริ่มต้นใช้งานและทำงานบนเบราว์เซอร์ทั้งหมดยกเว้น webviews แอปพลิเคชันเช่น (CefSharp Chromium ฯลฯ ... ) ฉันหวังว่ารหัสของฉันจะช่วยให้คุณและโชคดี!

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>



0

หากคุณต้องการเรียกใช้ฟังก์ชันในขณะที่เหตุการณ์คลิกขวาหมายความว่าเราสามารถใช้งานได้ดังต่อไปนี้

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

<script>
function func(){
alert("Yes");
}
</script>


0

ลองใช้whichและ / หรือbuttonสถานที่ให้บริการ

สาธิต

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);

ข้อมูลบางอย่างที่นี่


-1

จัดการกับเหตุการณ์โดยใช้jQueryห้องสมุด

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

-1

เพื่อจัดการคลิกขวาจากเมาส์คุณสามารถใช้เหตุการณ์ 'oncontextmenu' ด้านล่างเป็นตัวอย่าง:

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

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


คำตอบของคุณจะมีประโยชน์มากกว่าถ้าตอบด้วยคำตอบที่โปรโมตเฟรมเวิร์กคำตอบของคุณจะมีประโยชน์มากกว่าถ้ามันมีโซลูชันวานิลลา JS และอาจอธิบายเพิ่มเติมเพื่ออธิบายว่าจะใช้เฟรมเวิร์กของคุณได้ง่ายขึ้นอย่างไร
Xaniff

ตกลง ... ขอบคุณสำหรับคำแนะนำ .. จริงๆแล้วมันง่ายมากกับ vanilA js ด้วย
Sayanjyoti Das

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