Sağ tıklama bir Javascript etkinliği mi?


173

Sağ tıklama bir Javascript etkinliği mi? Öyleyse, nasıl kullanırım?

Yanıtlar:


188

Diğerlerinin de belirttiği gibi, sağ fare düğmesi olağan fare olayları (fareyle üzerine gelme, fare ile tıklama, tıklama) ile tespit edilebilir . Ancak, sağ tıklama menüsü açıldığında bir tetikleme etkinliği arıyorsanız, yanlış yere bakıyorsunuz. Sağ tıklama / içerik menüsüne klavyeden de erişilebilir (shift + F10 veya Windows ve bazı Linux'ta içerik menüsü tuşu). Bu durumda, aradığınız olay oncontextmenu:

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

Fare olaylarının kendilerine gelince, tarayıcılar olay nesnesine olay işleme işlevinden erişilebilen bir özellik ayarlar:

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
Tıpkı / düğme sorununda olduğu gibi, 'oncontextmenu' tüm tarayıcılarda aynı şekilde uygulanmaz ... bazı ' gotchas' için quirksmode.org/dom/events/contextmenu.html adresine bakın .
smencer

3
@AndyE Merhaba Andy, ifade (isRightMB?"was not" : "")olmalı (isRightMB?"was" : "was not"). Sağ ? Lütfen gözden geçirmeye yardımcı olun.
Joe.wang

1
@Joe: komik nasıl 32 oy ve 4 yıl kimse fark etmeden gitti ;-) Sanırım, mazur görülebilir - Ben cevap yazarken 00:30 oldu!
Andy E

1
Mac FF'de ctrl + sağ tıklamanın sol fare tıklaması (e.which === 1), Mac Chrome'da ctrl + sağ tıklamanın beklenen sağ fare tıklaması (e.ctrlKey && e) ile geleceğini unutmayın. .which === 3).
ND

8
Chrome 59, sağ fare düğmesi tetikleyiciler içinde onmousedownve onmouseupancak onclick. Görünüşe göre, Chrome'da onclickyalnızca sol fare düğmesi için tetikleniyor. sağ fare tıklama algılamak için (ve çocuklar evet, bu birden çok kez test edilmiş), birleştirmek ya zorunda onmousedownve onmouseup, veya kullanım oncontextmenu.
Venryx

27

aşağıdaki jQuery koduna bir göz atın:

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

Değeri which:

  • Sol düğme için 1
  • Orta düğme için 2
  • 3 sağ düğme için

2
Eeeew, bu korkunç! Neden aynı .whichdeğil .button? Oo .button=> 0,1,2 ; which=> 1,2,3 . bu sadece yanlış.
Ben Philipp

11

Etkinliği kullanabilirsiniz, window.oncontextmenuörneğin:

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


Bu da mb bıraktı
Alex

Harika +1, şimdi içerik menüsünü nasıl engelleyebilirim? @ user12345678
Shayan

2
Şafak e.preventDefault ()
Brian Allan West

@BrianAllanWest Bu jQuery mi? Bunu nasıl kullanacağımı bilmiyorum. window.oncontextmenu = function () { e.preventDefault() }işe yaramadı.
Shayan

2
@Shayan, hayır bu ham javascript ... bunu şöyle kullanırsınız ... window.oncontextmenu = function (e) {e.preventDefault ();} Bu, bağlam menüsü (ör .: fareyle sağ tıklayın veya basılı tutun).
Brian Allan West

6

W3c, sağ tıklamanın tıklama olayı tarafından algılanabileceğini söylüyor olsa da, onClick normal tarayıcılarda sağ tıklama ile tetiklenmez.

Aslında, sağ tıklama sadece onMouseDown onMouseUp ve onContextMenu tetiklenir.

Bu nedenle, "onContextMenu" öğesini sağ tıklama olayı olarak kabul edebilirsiniz. Bu bir HTML5.0 standardıdır.


1
Evet, özellikle yeni tarayıcıları hedefliyorsanız harika bir çözüm gibi geliyor. IE 5.5 bile öğeler üzerinde desteklediğinden, bu sadece bir HTML5.0 olduğunu sanmıyorum! Hangi tarayıcıların desteklediği hakkında daha fazla bilgi: quirksmode.org/dom/events/contextmenu.html
Ignas2526

5

Sağ fare tıklamasını algılamak istiyorsanız, MouseEvent.whichözelliği standart olmadığı ve tarayıcılar arasında büyük uyumsuzluk olduğu için kullanmamalısınız. (bkz. MDN ) Bunun yerine kullanmalısınız MouseEvent.button. Belirli bir düğmeyi temsil eden bir sayı döndürür:

  • 0: Ana düğme basıldı, genellikle sol düğme veya başlatılmamış durum
  • 1: Yardımcı düğmeye basıldı, genellikle tekerlek düğmesi veya orta düğme (varsa)
  • 2: İkincil düğmeye basıldı, genellikle sağ düğme
  • 3: Dördüncü düğme, genellikle Tarayıcı Geri düğmesi
  • 4: Beşinci düğme, genellikle Tarayıcı İlet düğmesi

MouseEvent.button standart fareden daha fazla girdi türü kullanır:

Düğmeler standart "soldan sağa" düzeninden farklı bir şekilde yapılandırılabilir. Sol elle kullanım için yapılandırılan bir farede düğme eylemleri tersine çevrilmiş olabilir. Bazı işaret aygıtlarında yalnızca bir düğme bulunur ve ana, ikincil, yardımcı vb. Belirtmek için klavye veya diğer giriş mekanizmaları kullanılır. Diğerlerinde farklı işlevlere ve düğme değerlerine eşlenmiş birçok düğme bulunabilir.

Referans:

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

Bu arama yaparken gördüğüm ilk cevap olsaydı
Gunnar Már Óttarsson

3

Hayır, ancak "onmousedown" etkinliğinde hangi fare düğmesinin kullanıldığını algılayabilir ve oradan "sağ tık" olup olmadığını belirleyebilirsiniz.


@Brian: sağ tık tetikleyecek onmousedown, onmouseupve onclick. Bununla birlikte, sağ tıklama menüsünü geçersiz kılmaya çalışıyorsanız, bu etkinlikler kullanmanız gerekenler değildir (aşağıdaki cevabıma bakın).
Andy E

2

Aşağıdaki kod, rightclickvarsayılan mousedownve mouseupolaylara dayalı özel bir olay oluşturmak için jQuery kullanır . Aşağıdaki hususları dikkate alır:

  • fareyle tetikleme
  • yalnızca daha önce aynı öğeye fareyle basıldığında tetikleme
  • bu kod özellikle JFX Webview'da da çalışır ( contextmenuolay orada tetiklenmediğinden)
  • klavyedeki contextmenu tuşu ile çözüm gibi (basıldığında o tetiklemek DEĞİLDİR on('contextmenu', ...)yapar

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

Evet öyle!

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
}

İyi - teknik olarak bir "olay" değil, ama kullanılabilir.
ChickenMilkBomb

@TimothyKhouri (ve burada başka herhangi biri): Bu uyumlu bir olay dinleyici işlevidir. Sen ikinci argüman olarak işlev nesnesini kendisi geçerdi addEventListener sonra olur, diyoruz belirtilen olayın meydana gelmesi durumunda bunu. Örneğin:elem.addEventListener("click", doSomething)
John Weisz

1

Evet, oncontextmenu muhtemelen en iyi alternatiftir, ancak farenin aşağısında tetiklendiğini, ancak farenin tıklanmasında tetikleneceğini unutmayın.

İlgili diğer sorular, manuel zamanlayıcı kontrolü dışında görünüşte desteklenmeyen çift sağ tıklama hakkında sorular soruyordu. Sağ çift tıklamaya sahip olmanızın bir nedeni, sol fare girişini (düğme tersine çevirme) gerekli / desteklemenizdir. Tarayıcı uygulamaları, mevcut giriş cihazlarını nasıl kullanmamız gerektiği konusunda birçok varsayım yapıyor gibi görünüyor.


1

Sağ tıklamayı yapmanın en kolay yolu kullanmaktır

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

 });

Ancak bu çapraz tarayıcı çözümü değildir, tarayıcılar bu olay için özellikle firefox ve IE gibi farklı davranır. Çapraz tarayıcı çözümü için aşağıda tavsiye ederim

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

1

Ateş etmenin en kolay yolu budur ve (CefSharp Chromium vb ...) gibi uygulama web görünümleri hariç tüm tarayıcılarda çalışır. Umarım kodum size yardımcı olur ve iyi şanslar!

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>


1

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


0

Sağ tıklama olayı sırasında işlevi çağırmak istiyorsanız, aşağıdakileri kullanabiliriz

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

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

0

Bu benimle çalıştı

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

0

whichVe / veya buttonmülkü kullanmayı deneyin

gösteri

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

Burada bazı bilgiler


-1

jQueryKütüphaneyi kullanarak olayı işleme

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

-1

Fareden sağ tıklamayı işlemek için 'oncontextmenu' olayını kullanabilirsiniz. Aşağıda bir örnek verilmiştir:

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

yukarıdaki kod, sağ tıklandığında bazı metinleri uyarır. Tarayıcının varsayılan menüsünün görünmesini istemiyorsanız return false ekleyebilirsiniz; Fonksiyon içeriğinin sonunda. Teşekkürler.


Sadece bir çerçeveyi tanıtan bir yanıtla yanıt vermek yerine, cevabınız vanilya JS çözümü içeriyorsa daha yararlı olacaktır ve daha sonra çerçevenizi nasıl kullanmanın daha kolay olabileceğini tanımlamak için belki de daha ayrıntılı olacaktır.
Xaniff

Tamam ... Tavsiye için teşekkürler .. Aslında vanilA js ile çok kolay
Sayanjyoti Das

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.