JQuery live ('click') стрельба для щелчка правой кнопкой мыши
Я заметил странное поведение функции live()
в jQuery:
<a href="#" id="normal">normal</a>
<a href="#" id="live">live</a>
$('#normal').click(clickHandler);
$('#live').live('click', clickHandler);
function clickHandler() {
alert("Clicked");
return false;
}
Это прекрасно и денди, пока вы не щелкаете правой кнопкой мыши по "живой" ссылке и не запускаете обработчик, а затем не показываете контекстное меню. Обработчик событий не запускается вообще (как и ожидалось) по "нормальной" ссылке.
Мне удалось обойти это, изменив обработчик на это:
function clickHandler(e) {
if (e.button != 0) return true;
// normal handler code here
return false;
}
Но это действительно раздражает, чтобы добавить это ко всем обработчикам событий. Есть ли лучший способ, чтобы обработчики событий запускались только как обычные обработчики кликов?
Ответы
Ответ 1
Это известная проблема:
Похоже, Firefox не запускает событие click для элемента на щелкните правой кнопкой мыши, хотя он запускает mousedown и mouseup. Однако это запускает событие click на document
! Поскольку .live
улавливает событий на уровне документа, он видит событие click для элемента even хотя сам элемент этого не делает. Если вы используете событие, например mouseup, оба элемент p
и document
вы увидите событие.
Ваше обходное решение - лучшее, что вы можете сделать сейчас. Похоже, что это влияет только на Firefox (я считаю, что это на самом деле ошибка в Firefox, а не jQuery как таковая).
См. также этот вопрос вчера.
Ответ 2
Я нашел решение - "исправить" сам код live()
.
В неустановленном источнике jQuery 1.3.2 вокруг строки 2989 существует функция, называемая liveHandler()
. Измените код, чтобы добавить одну строку:
2989: function liveHandler(event) {
2990: if (event.type == 'click' && event.button != 0) return true;
Это остановит события щелчка от стрельбы по чему-либо, кроме левой кнопки мыши. Если вы особенно хотели, вы могли бы легко изменить код, чтобы также допускать события "rightclick", но это работает для меня, поэтому он остается на этом.
Ответ 3
Вы можете переписать его как:
function reattachEvents(){
$(element).unbind('click').click(function(){
//do something
});
}
и вызывать его, когда вы добавляете новый элемент dom, он должен иметь ожидаемый результат (без стрельбы по событию правого клика).
Ответ 4
Это неудачное последствие реализации live
. Он фактически использует событие bubbling, так что вы не привязываетесь к событию click для элемента привязки, вы привязываетесь к событию щелчка документа.
Ответ 5
Я решил это, используя события mousedown. В моей ситуации различие между кустарником и щелчком не имело значения.