предотвратить ранее определенные события при наведении мыши только для щелчка правой кнопкой мыши

У меня есть дека с кнопками, которые запускают сообщения AJAX при нажатии мыши.

Идеальная функциональность — воспроизводить звук при нажатии левой кнопки мыши и отменять воспроизведение при нажатии правой кнопки мыши.

Код, который у меня есть до сих пор, отключает контекстное меню и отменяет воспроизведение... однако, если они находятся над кнопкой при щелчке правой кнопкой мыши (что вызывает другие ранее определенные события), он все равно будет учитывать нажатие мыши и воспроизводить этот звук.

$(document).ready(function(){ 
  document.oncontextmenu = function() {return false;};
  $(document).mousedown(function(e){ 
    if( e.which == 3 ) {
        e.preventDefault();
        Cancel_Playback();
      return false; 
    } 
    return true; 
  }); 
});

Я пытаюсь отключить запуск ранее определенных событий нажатием правой кнопки мыши, но соблюдаю Cancel_Playback. Любые идеи?

EDIT Обновлены заголовок и описание, чтобы более точно отразить то, чего я пытаюсь достичь. Это также должно помочь: http://jsfiddle.net/g9sh1dme/15/


person J--    schedule 09.09.2014    source источник
comment
Вы уверены, что 3 правильная кнопка?   -  person dandavis    schedule 10.09.2014
comment
Да, с этим текущим кодом Cancel_Playback выполняется при щелчке правой кнопкой мыши, так что.. Я полагаю, что если вы используете e.button, щелчок правой кнопкой мыши будет 2.. но с e.what это 3.   -  person J--    schedule 10.09.2014
comment
Что именно делают эти кнопки? Другими словами, что вы пытаетесь предотвратить, отправляют ли они форму или к ним прикреплены другие обработчики событий javascript, которые вы пытаетесь предотвратить?   -  person adeneo    schedule 10.09.2014
comment
Они выполняют другую функцию: Play_Sound(SoundFile) - это то, что я хотел бы предотвратить.   -  person J--    schedule 10.09.2014
comment
На самом деле, в зависимости от кнопки, она может выполнять и другие функции. Однако в основном это функция воспроизведения, которую я хочу отключить.   -  person J--    schedule 10.09.2014
comment
Имя preventDefault, оно предотвращает действие по умолчанию, вы не можете предотвратить запуск других функций javascript, добавив дополнительные обработчики событий.   -  person adeneo    schedule 10.09.2014
comment
Наверное, я надеялся, что это предотвратит то, что в противном случае было бы сделано, но затем выполнит указанную мной функцию :) Но я понимаю, что вы говорите ... это не имело бы никакого смысла. Есть ли там строка, которую я мог бы использовать, чтобы сказать не делай этого, а делай это вместо этого?   -  person J--    schedule 10.09.2014
comment
jsfiddle.net/v6ywg1hL/1 не могу щелкнуть правой кнопкой мыши и функция срабатывает, что не работает?   -  person im_brian_d    schedule 10.09.2014
comment
На самом деле, то, что я пытаюсь предотвратить, — это другие ранее определенные события, которые запускаются при нажатии кнопки мыши. В идеале все, кроме Cancel_Playback, срабатывает при нажатии левой кнопки мыши, и только Cancel_Playback срабатывает при нажатии правой кнопки мыши.   -  person J--    schedule 10.09.2014
comment
jsfiddle.net/g9sh1dme/15 — я немного изменил это, чтобы показать, чего я пытаюсь достичь ....   -  person J--    schedule 10.09.2014


Ответы (1)


stopImmediatePropagation — это, вероятно, функция, которую вы ищете.

Он отменяет все другие события, связанные с тем же элементом, и любые другие делегаты выше в DOM. Порядок также имеет значение, так как события вызываются в том порядке, в котором они были связаны. Вы можете отменить только события, которые были связаны после события, выполняющего отмену.

Я не уверен, поддерживают ли эти изменения актуальность вашей программы, но они демонстрируют использование функции. В противном случае я бы просто проверял правую кнопку мыши в Play_Sound и выходил вместо того, чтобы делать ставку на другое событие, чтобы отменить его выполнение.

Демонстрация в реальном времени

$(document).ready(function(){ 
  document.oncontextmenu = function() {return false;};
  //For this to work you must bind to the same object or you must bind to something lower in the DOM.
  $(".sound").mousedown(function(e){ 
    if( event.which == 3 ) {
        Cancel_Playback();
        e.stopImmediatePropagation();
        return false; 
    } 
    return true; 
  }).mousedown(Play_Sound);
})

function Cancel_Playback() {
    alert("This is all that should be displayed on right-mousedown")
}

function Play_Sound() {
    alert("Display this on left-mousedown... but not on right-mousedown")
}
person Brandon Boone    schedule 10.09.2014
comment
Это отлично работает в демоверсии! Я попытался адаптировать это к своему собственному коду, но не смог заставить его работать. Мой код немного сложнее, чем в примере, я думаю... Я уверен, что если бы я был немного лучше в этом, это сработало бы. Однако я заставил его работать к if( event.which == 1 ) событию для Play_Sound. Цените ответ! - person J--; 12.09.2014