Как отличить щелчок левой и правой кнопкой мыши с помощью jQuery
Как получить нажатую кнопку мыши с помощью jQuery?
$('div').bind('click', function(){
alert('clicked');
});
это вызвано как правой, так и левой кнопкой мыши, каков способ поймать щелчок правой кнопкой мыши? Я был бы счастлив, если что-то вроде ниже существует:
$('div').bind('rightclick', function(){
alert('right mouse button is pressed');
});
16 ответов:
начиная с версии jQuery 1.1.3,
event.which
нормализируетevent.keyCode
иevent.charCode
Так что вам не придется беспокоиться о проблемах совместимости браузера. документацияevent.which
event.which
будет давать 1, 2 или 3 для левой, средней и правой кнопок мыши соответственно так:$('#element').mousedown(function(event) { switch (event.which) { case 1: alert('Left Mouse button pressed.'); break; case 2: alert('Middle Mouse button pressed.'); break; case 3: alert('Right Mouse button pressed.'); break; default: alert('You have a strange Mouse!'); } });
Edit: Я изменил его на работу для динамически добавляемых элементов с помощью
.on()
в jQuery 1.7 и выше:$(document).on("contextmenu", ".element", function(e){ alert('Context Menu event has fired!'); return false; });
демо: jsfiddle.net/Kn9s7/5
[начало оригинального сообщения] это то, что сработало для меня:
$('.element').bind("contextmenu",function(e){ alert('Context Menu event has fired!'); return false; });
в случае, если вы находитесь в нескольких решений ^^
Edit: Тим Даун поднимает хороший момент, что это не всегда будет
right-click
что пожаровcontextmenu
событие, но и когда клавиша контекстного меню нажата (что, возможно, является заменой дляright-click
)
Вы можете легко сказать, какая кнопка мыши была нажата путем проверки
which
свойство объекта события на события мыши:/* 1 = Left mouse button 2 = Centre mouse button 3 = Right mouse button */ $([selector]).mousedown(function(e) { if (e.which === 3) { /* Right mouse button was clicked! */ } });
вы можете
bind
доcontextmenu
иreturn false
:$('selector').bind('contextmenu', function(e){ e.preventDefault(); //code return false; });
демо: http://jsfiddle.net/maniator/WS9S2/
или вы можете сделать быстрый плагин, который делает то же самое:
(function( $ ) { $.fn.rightClick = function(method) { $(this).bind('contextmenu rightclick', function(e){ e.preventDefault(); method(); return false; }); }; })( jQuery );
демо: http://jsfiddle.net/maniator/WS9S2/2/
используя
.on(...)
jQuery > = 1.7:$(document).on("contextmenu", "selector", function(e){ e.preventDefault(); //code return false; }); //does not have to use `document`, it could be any container element.
$("#element").live('click', function(e) { if( (!$.browser.msie && e.button == 0) || ($.browser.msie && e.button == 1) ) { alert("Left Button"); } else if(e.button == 2){ alert("Right Button"); } });
обновление для текущего состояния вещей:
var $log = $("div.log"); $("div.target").on("mousedown", function() { $log.text("Which: " + event.which); if (event.which === 1) { $(this).removeClass("right middle").addClass("left"); } else if (event.which === 2) { $(this).removeClass("left right").addClass("middle"); } else if (event.which === 3) { $(this).removeClass("left middle").addClass("right"); } });
div.target { border: 1px solid blue; height: 100px; width: 100px; } div.target.left { background-color: #0faf3d; } div.target.right { background-color: #f093df; } div.target.middle { background-color: #00afd3; } div.log { text-align: left; color: #f00; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="target"></div> <div class="log"></div>
$.event.special.rightclick = { bindType: "contextmenu", delegateType: "contextmenu" }; $(document).on("rightclick", "div", function() { console.log("hello"); return false; });
есть много очень хороших ответов, но я просто хочу коснуться одной важной разницы между IE9 и IE event.button.
согласно старой спецификации Microsoft для
event.button
коды отличаются от используемых W3C. W3C рассматривает только 3 случая:
- нажата левая кнопка мыши -
event.button === 1
- нажата правая кнопка мыши -
event.button === 3
- средняя кнопка мыши нажата -
event.button === 2
в старых интернет-исследователях, однако, Microsoft немного переворачивает нажатую кнопку, и есть 8 случаев:
- кнопка не нажата -
event.button === 0
и 000- нажата левая кнопка -
event.button === 1
или 001- нажата правая кнопка -
event.button === 2
или 010- нажимаются левая и правая кнопки -
event.button === 3
или 011- нажата средняя кнопка -
event.button === 4
100 или- среднего и левые кнопки нажимаются -
event.button === 5
или 101- средняя и правая кнопки -
event.button === 6
или 110- все 3 кнопки -
event.button === 7
или 111несмотря на то, что теоретически это должно работать, ни один Internet Explorer никогда не поддерживал случаи одновременного нажатия двух или трех кнопок. Я упоминаю об этом, потому что стандарт W3C не может даже теоретически поддержать это.
мне кажется, что небольшая адаптация ответа TheVillageIdiot была бы чище:
$('#element').bind('click', function(e) { if (e.button == 2) { alert("Right click"); } else { alert("Some other click"); } }
EDIT: JQuery предоставляет
e.which
атрибут, возвращающий 1, 2, 3 для левого, среднего и правого щелчка соответственно. Так что вы также можете использоватьif (e.which == 3) { alert("right click"); }
см. также: ответы на "запуск события onclick с помощью средней кнопки"
event.which === 1
гарантирует, что это щелчок левой кнопкой мыши (при использовании jQuery).но вы также должны думать о клавиш: ctrl cmdshift alt
Если вы заинтересованы только в ловле простых, немодифицированных щелчков левой кнопкой мыши, вы можете сделать что-то вроде этого:
var isSimpleClick = function (event) { return !( event.which !== 1 || // not a left click event.metaKey || // "open link in new tab" (mac) event.ctrlKey || // "open link in new tab" (windows/linux) event.shiftKey || // "open link in new window" event.altKey // "save link as" ); }; $('a').on('click', function (event) { if (isSimpleClick(event)) { event.preventDefault(); // do something... } });
если вы ищете "лучшие события мыши Javascript", которые позволяют
- левый mousedown
- средний mousedown
- справа событий mousedown
- левый mouseup
- средний mouseup
- правый mouseup
- щелкните левой кнопкой мыши
- среднюю нажмите кнопку
- щелкните правой кнопкой мыши
- колесико мыши вверх
- колесико мыши вниз
посмотрите на этот кросс-браузер нормально javascript, который запускает вышеуказанные события, и удаляет головную боль работы. Просто скопируйте и вставьте его в голову вашего скрипта, или включите его в файл в
<head>
вашего документа. Затем свяжите свои события, обратитесь к следующему блоку кода ниже, который показывает пример jQuery захвата событий и запуска назначенных им функций, хотя это также работает с обычной привязкой javascript.если вы заинтересованы в том, чтобы увидеть его работу, взгляните на jsFiddle: https://jsfiddle.net/BNefn/
/** Better Javascript Mouse Events Author: Casey Childers **/ (function(){ // use addEvent cross-browser shim: https://gist.github.com/dciccale/5394590/ var addEvent = function(a,b,c){try{a.addEventListener(b,c,!1)}catch(d){a.attachEvent('on'+b,c)}}; /* This function detects what mouse button was used, left, right, middle, or middle scroll either direction */ function GetMouseButton(e) { e = window.event || e; // Normalize event variable var button = ''; if (e.type == 'mousedown' || e.type == 'click' || e.type == 'contextmenu' || e.type == 'mouseup') { if (e.which == null) { button = (e.button < 2) ? "left" : ((e.button == 4) ? "middle" : "right"); } else { button = (e.which < 2) ? "left" : ((e.which == 2) ? "middle" : "right"); } } else { var direction = e.detail ? e.detail * (-120) : e.wheelDelta; switch (direction) { case 120: case 240: case 360: button = "up"; break; case -120: case -240: case -360: button = "down"; break; } } var type = e.type if(e.type == 'contextmenu') {type = "click";} if(e.type == 'DOMMouseScroll') {type = "mousewheel";} switch(button) { case 'contextmenu': case 'left': case 'middle': case 'up': case 'down': case 'right': if (document.createEvent) { event = new Event(type+':'+button); e.target.dispatchEvent(event); } else { event = document.createEventObject(); e.target.fireEvent('on'+type+':'+button, event); } break; } } addEvent(window, 'mousedown', GetMouseButton); addEvent(window, 'mouseup', GetMouseButton); addEvent(window, 'click', GetMouseButton); addEvent(window, 'contextmenu', GetMouseButton); /* One of FireFox's browser versions doesn't recognize mousewheel, we account for that in this line */ var MouseWheelEvent = (/Firefox/i.test(navigator.userAgent)) ? "DOMMouseScroll" : "mousewheel"; addEvent(window, MouseWheelEvent, GetMouseButton); })();
лучше пример событий щелчка мыши (использует jquery для простоты, но выше будет работать кросс-браузер и запускать те же имена событий, т. е. использует перед именами)
<div id="Test"></div> <script type="text/javascript"> $('#Test').on('mouseup',function(e){$(this).append(e.type+'<br />');}) .on('mouseup:left',function(e){$(this).append(e.type+'<br />');}) .on('mouseup:middle',function(e){$(this).append(e.type+'<br />');}) .on('mouseup:right',function(e){$(this).append(e.type+'<br />');}) .on('click',function(e){$(this).append(e.type+'<br />');}) .on('click:left',function(e){$(this).append(e.type+'<br />');}) .on('click:middle',function(e){$(this).append(e.type+'<br />');}) .on('click:right',function(e){$(this).append(e.type+'<br />');}) .on('mousedown',function(e){$(this).html('').append(e.type+'<br />');}) .on('mousedown:left',function(e){$(this).append(e.type+'<br />');}) .on('mousedown:middle',function(e){$(this).append(e.type+'<br />');}) .on('mousedown:right',function(e){$(this).append(e.type+'<br />');}) .on('mousewheel',function(e){$(this).append(e.type+'<br />');}) .on('mousewheel:up',function(e){$(this).append(e.type+'<br />');}) .on('mousewheel:down',function(e){$(this).append(e.type+'<br />');}) ; </script>
и для тех, кто нуждается в уменьшенной версии...
!function(){function e(e){e=window.event||e;var t="";if("mousedown"==e.type||"click"==e.type||"contextmenu"==e.type||"mouseup"==e.type)t=null==e.which?e.button<2?"left":4==e.button?"middle":"right":e.which<2?"left":2==e.which?"middle":"right";else{var n=e.detail?-120*e.detail:e.wheelDelta;switch(n){case 120:case 240:case 360:t="up";break;case-120:case-240:case-360:t="down"}}var c=e.type;switch("contextmenu"==e.type&&(c="click"),"DOMMouseScroll"==e.type&&(c="mousewheel"),t){case"contextmenu":case"left":case"middle":case"up":case"down":case"right":document.createEvent?(event=new Event(c+":"+t),e.target.dispatchEvent(event)):(event=document.createEventObject(),e.target.fireEvent("on"+c+":"+t,event))}}var t=function(e,t,n){try{e.addEventListener(t,n,!1)}catch(c){e.attachEvent("on"+t,n)}};t(window,"mousedown",e),t(window,"mouseup",e),t(window,"click",e),t(window,"contextmenu",e);var n=/Firefox/i.test(navigator.userAgent)?"DOMMouseScroll":"mousewheel";t(window,n,e)}();
$("body").on({ click: function(){alert("left click");}, contextmenu: function(){alert("right click");} });
$(document).ready(function () { var resizing = false; var frame = $("#frame"); var origHeightFrame = frame.height(); var origwidthFrame = frame.width(); var origPosYGrip = $("#frame-grip").offset().top; var origPosXGrip = $("#frame-grip").offset().left; var gripHeight = $("#frame-grip").height(); var gripWidth = $("#frame-grip").width(); $("#frame-grip").mouseup(function (e) { resizing = false; }); $("#frame-grip").mousedown(function (e) { resizing = true; }); document.onmousemove = getMousepoints; var mousex = 0, mousey = 0, scrollTop = 0, scrollLeft = 0; function getMousepoints() { if (resizing) { var MouseBtnClick = event.which; if (MouseBtnClick == 1) { scrollTop = document.documentElement ? document.documentElement.scrollTop : document.body.scrollTop; scrollLeft = document.documentElement ? document.documentElement.scrollLeft : document.body.scrollLeft; mousex = event.clientX + scrollLeft; mousey = event.clientY + scrollTop; frame.height(mousey); frame.width(mousex); } else { resizing = false; } } return true; } });
С jquery вы можете использовать
event object type
jQuery(".element").on("click contextmenu", function(e){ if(e.type == "contextmenu") { alert("Right click"); } });
есть также способ, чтобы сделать это без JQuery!
проверить это:
document.addEventListener("mousedown", function(evt) { switch(evt.buttons) { case 1: // left mouse case 2: // right mouse case 3: // middle mouse <- I didn't tested that, I just got a touchpad } });
$.fn.rightclick = function(func){ $(this).mousedown(function(event){ if(event.button == 2) { var oncontextmenu = document.oncontextmenu; document.oncontextmenu = function(){return false;}; setTimeout(function(){document.oncontextmenu = oncontextmenu;},300); func(event); return false; } }); }; $('.item').rightclick(function(e){ alert("item"); });