Ответ 1
Событие клика обычно запускается левой кнопкой мыши, однако в зависимости от браузера событие клика может или не может появиться для правой и/или средней кнопки.
В Internet Explorer и Firefox событие клика не запускается для правой или средней кнопки.
Поэтому мы не можем надежно использовать событие click для обработчиков событий на средней или правой кнопке.
Вместо этого, чтобы различать кнопки мыши, мы должны использовать события mousedown и mouseup, поскольку большинство браузеров запускают mousedown и mouseup события для любой кнопки мыши.
в Firefox и Chrome event.which
должен содержать номер, указывающий, какая кнопка мыши была нажата (1 слева, 2 - средний, 3 - правый).
В Internet Explorer, с другой стороны, event.button
указывает, какая кнопка мыши была нажата (1 слева, 4 - посередине, 2 - справа);
event.button
должен также работать в Firefox и других браузерах, но цифры могут быть немного разными (0 слева, 1 - средний, 2 - правый).
Итак, чтобы собрать это вместе, мы обычно делаем что-то вроде этого:
document.onmousedown = function(e) {
var evt = e==null ? event : e;
if (evt.which) { // if e.which, use 2 for middle button
if (evt.which === 2) {
// middle button clicked
}
} else if (evt.button) { // and if e.button, use 4
if (evt.button === 4) {
// middle button clicked
}
}
}
Поскольку jQuery нормализует event.which
, вам нужно использовать его только в обработчиках событий jQuery и, как таковые, делать:
$('div a').on('mousedown', function(e) {
if (e.which === 2) {
// middle button clicked
}
});
Другими словами, вы не можете использовать событие onclick, поэтому для его имитации вы можете использовать как mousedown, так и mouseup.
Вы можете добавить таймер, чтобы ограничить время, разрешенное между событием mousedown и mouseup, или даже выбросить обработчик mousemove для ограничения перемещения между событием mousedown и mouseup и сделать обработчик события не срабатывающим, если указатель мыши перемещается более десяти пикселей и т.д. возможности практически бесконечны, поэтому это не должно быть проблемой.
$('#test').on({
mousedown: function(e) {
if (e.which === 2) {
$(this).data('down', true);
}
},
mouseup: function(e) {
if (e.which === 2 && $(this).data('down')) {
alert('middle button clicked');
$(this).data('down', false);
}
}
});