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. В моей ситуации различие между кустарником и щелчком не имело значения.