Обнаружение нажатия левой кнопки мыши

Я ненавижу этот беспорядок с помощью кнопок мыши, созданных W3C MS! Я хочу знать, нажата ли левая кнопка мыши, когда я получаю событие mousedown.

Я использую этот код

// Return true if evt carries left mouse button press
function detectLeftButton(evt) {
  // W3C
  if (window.event == null) {
    return (evt.button == 0)
  }
  // IE
  else {
    return (evt.button == 1);
  }
}

однако он не работает в Opera и Chrome, потому что так происходит в этом окне.событие существует и там.

Так что же мне делать? У меня есть обнаружение браузера, но мы все знаем, что на него нельзя полагаться со всей маскировкой некоторых браузеров в последнее время. Как я могу обнаружить левый кнопка мыши надежно?

5 ответов


обновленный ответ. Следующее определит, нажата ли левая и только левая кнопка мыши:

function detectLeftButton(evt) {
    evt = evt || window.event;
    if ("buttons" in evt) {
        return evt.buttons == 1;
    }
    var button = evt.which || evt.button;
    return button == 1;
}

дополнительную информацию об обработке событий мыши в JavaScript, попробовать http://unixpapa.com/js/mouse.html


сейчас стандарт W3C event.buttons свойство, поддерживаемое в IE9 в стандартном режиме и геккон 15+.

на консорциума W3C полностью набивается мероприятие.свойство button, поэтому для события браузера, совместимого со стандартами.кнопка 0, но для браузеров, созданных до стандартного события.кнопка 1.

код должны избегайте использования event.button за исключением старых браузеров. Следующий код должен работа:

function detectLeftButton(event) {
    if (event.metaKey || event.ctrlKey || event.altKey || event.shiftKey) {
        return false;
    } else if ('buttons' in event) {
        return event.buttons === 1;
    } else if ('which' in event) {
        return event.which === 1;
    } else {
        return (event.button == 1 || event.type == 'click');
    }
}

вы можете использовать следующий код-

onmouseup="if(window.event.which==1){//code for left click}
           else if(window.event.which==3){//code for right click}"

хотя события.кнопки теперь работают в Chrome, Safari по-прежнему не поддерживает его. Одним из обходных путей является использование событий onmousedown и onmouseup на уровне документа или родителя, например: onmousedown= "bMouseDown=true" onmouseup="bMouseDown=false"


// 0 left, 2 right, 1 middle, other.. extra buttons, gaming mouses

var buttonsArray = [false, false, false, false, false, false, false, false, false];
var mousePressed = false;

document.onmousedown = function(e) {
    buttonsArray[e.button] = true;
    mousePressed = true;
};

document.onmouseup = function(e) {
    buttonsArray[e.button] = false;
    mousePressed = false;
};

document.oncontextmenu = function() {
    return false;
}

объяснение: когда мышь не работает, мы меняем на true нажатую кнопку в нашем массиве кнопок. Когда мышь включена, мы меняем на false нажатую кнопку на false.

теперь мы можем установить, какая кнопка нажата более точно, но у нас есть проблема с правой кнопкой мыши.. потому что с помощью этой кнопки мы открываем contextmenu в браузере, и это ускользает от нашего контроля... Итак, мы отключаем контекстное меню, чтобы правильно обнаружить щелчок правой кнопкой мыши. Если мы этого не сделаем, мы должны решить левый клик тоже... и это осложнение, которое ускользает от этой реакции.

чтобы упростить вещи, мы можем добавить другую переменную mousePressed и флаг, если мышь вниз или вверх.

отлично работает в chrome, я не тестировал его в другом браузере, но я думаю, что это нормально в firefox и opera... Т. е.??? Меня не волнует, то есть.

наслаждайтесь!