JavaScriptイベントを右クリックしますか?


173

JavaScriptイベントを右クリックしますか?もしそうなら、私はそれをどのように使用しますか?

回答:


188

他の人が述べたように、右マウスボタンは通常のマウスイベント(マウスダウン、マウスアップ、クリック)を通じて検出できます。ただし、右クリックメニューが表示されたときに発砲イベントを探している場合、間違った場所を探していることになります。右クリック/コンテキストメニューには、キーボードからアクセスすることもできます(Windowsおよび一部のLinuxではShift + F10またはコンテキストメニューキー)。この状況で、探しているイベントは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
which / buttonの問題と同様に、 'oncontextmenu'はすべてのブラウザーで同じように実装されていません... 'gotchas'の一部についてはquirksmode.org/dom/events/contextmenu.htmlを参照してください。
smencer 2010年

3
@AndyEこんにちはアンディ、式が(isRightMB?"was not" : "")なければなりません(isRightMB?"was" : "was not")。正しい ?それを確認するのを助けてください。
Joe.wang

1
@Joe:誰も気付かずに32票と4年間で投票した様子がおかしい;-)私は言い訳ができると思います-答えを書いたのは00:30でした!
アンディE 14

1
MacではFF ctrl + rightclickは左マウスクリック(e.which === 1)として通過しますが、Mac Chromeではctrl + rightclickは期待される右マウスクリック(e.ctrlKey && e .which === 3)。
ND

8
Chrome 59では、右マウスボタンでとがトリガーされますがonmousedownonmouseupはトリガーされませんonclick。どうやら、Chromeではonclick、左マウスボタンに対してのみトリガーされます。(そして、はい、私はこれを何度もテストしました)右マウスクリックを検出するには、とを組み合わせるか、onmousedownonmouseup使用する必要がありますoncontextmenu
Venryx 2017

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
ひどい!なぜ.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()
ブライアンアランウエスト

@BrianAllanWestそのjQueryですか?使い方がわかりません。window.oncontextmenu = function () { e.preventDefault() }うまくいきませんでした。
シャヤン

2
@Shayan、それは生のjavascriptではありません...次のように使用します... window.oncontextmenu = function(e){e.preventDefault();}これにより、コンテキストメニュー(つまり、マウスを右クリックするか、Macを押したままにします)。
ブライアンアランウェスト

6

はい、w3cはクリックイベントによって右クリックを検出できると言っていますが、通常のブラウザーでは右クリックによってonClickがトリガーされません。

実際、右クリックはonMouseDown、onMouseUpおよびonContextMenuのみをトリガーします。

したがって、「onContextMenu」は右クリックイベントと見なすことができます。これはHTML5.0標準です。


1
はい、特に新しいブラウザをターゲットにしている場合は、素晴らしいソリューションのように思えます。IE5.5でも要素でサポートされているため、これはHTML5.0だけだとは思いません!これは、どのブラウザーがそれをサポートするかについての詳細です:quirksmode.org/dom/events/contextmenu.html
Ignas2526 '14

5

右マウスクリックを検出する場合は、MouseEvent.whichプロパティが非標準であり、ブラウザ間で大きな非互換性があるため、プロパティを使用しないでください。(MDNを参照)代わりにを使用してくださいMouseEvent.button。指定されたボタンを表す数値を返します。

  • 0:押されたメインボタン、通常は左ボタンまたは初期化されていない状態
  • 1:補助ボタンが押されました。通常、ホイールボタンまたは中央ボタン(存在する場合)
  • 2:押されたセカンダリボタン、通常は右ボタン
  • 3:4番目のボタン、通常はブラウザの[戻る]ボタン
  • 4:5番目のボタン、通常はブラウザの[進む]ボタン

MouseEvent.button 標準のマウスだけでなく、より多くの入力タイプを処理します。

ボタンの構成は、標準の「左から右」のレイアウトとは異なる場合があります。左利き用に構成されたマウスでは、ボタンの操作が逆になる場合があります。一部のポインティングデバイスはボタンが1つだけで、キーボードまたはその他の入力メカニズムを使用してメイン、セカンダリ、補助などを示します。その他のポインティングデバイスには、さまざまな機能とボタン値にマップされた多くのボタンがある場合があります。

参照:

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

これが私が検索したときに最初に見た答えであることを願っています
GunnarMárÓttarsson'15 / 10/15

3

いいえ。ただし、「onmousedown」イベントで使用されたマウスボタンを検出できます。そして、そこから「右クリック」されたかどうかを判断します。


@ブライアン:右クリックするとonmousedownonmouseupとがトリガーされますonclick。ただし、右クリックメニューのオーバーライドを検討している場合は、これらのイベントを使用するべきではありません(以下の私の回答を参照)。
アンディE

2

次のコードは、jQueryを使用rightclickして、デフォルトmousedownとイベントに基づいてカスタムイベントを生成していますmouseup。次の点を考慮します。

  • マウスアップでトリガー
  • 同じ要素を前にマウスダウンしたときにのみトリガー
  • このコードは特にJFX Webviewでも機能します(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 2010年

@TimothyKhouri(およびここにいる他の誰でも):これは互換性のあるイベントリスナー関数です。関数オブジェクト自体を2番目の引数としてaddEventListenerに渡し、指定されたイベントの発生時にそれを呼び出します。例:elem.addEventListener("click", doSomething)
John Weisz

1

はい、おそらくoncontextmenuが最良の代替案ですが、マウスダウンでトリガーされるのに対し、クリックはマウスアップでトリガーされることに注意してください。

他の関連する質問は、ダブル右クリックについて尋ねていました-手動のタイマーチェック以外ではサポートされていないようです。右ダブルクリックを可能にしたい理由の1つは、左利きのマウス入力(ボタンの反転)をサポートする必要がある場合です。ブラウザーの実装では、使用可能な入力デバイスをどのように使用する必要があるかについて、多くの仮定を立てているようです。


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

これが起動する最も簡単な方法であり、(CefSharp Chromiumなど...)のようなアプリケーションのWebビューを除くすべてのブラウザーで機能します。私のコードがあなたと幸運を助けることを願っています!

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

右クリックイベント中に関数を呼び出したい場合は、以下を使用できます。

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

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

0

これは私と一緒に働いています

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

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 2016年

OK ...推奨に感謝します。vanilAjsを使用すると、実際には非常に簡単です
Sayanjyoti Das

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.