Событие jQuery click ведет себя по-разному с функцией live в Firefox - программирование

Событие jQuery click ведет себя по-разному с функцией live в Firefox

Использование события click с функцией live приводит к странному поведению при использовании Firefox *. С живым в Firefox, щелчок запускается при щелчке правой кнопкой мыши! То же самое не происходит в Internet Explorer 7 ни в Google Chrome.

Пример:

  • Без живого, перейдите к демонстрации и попробуйте щелкнуть правой кнопкой мыши пункты. Диалоговое меню должно появляются.
  • С живым, перейдите к демонстрации и попробуйте прямо нажав "Click me!". Теперь оба диалога меню и "Другой абзац".

* проверено с помощью firefox 3.5.3

4b9b3361

Ответ 1

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

$('a.foo').live("click", function(e) { 
    if (e.button == 0) { // 0 = left, 1 = middle, 2 = right 
        //left button was clicked
    } else {
        //other button was clicked (do nothing?)
        //return false or e.preventDefault()
    }
}); 

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

    $('a.foo').live("click", function(e) {
        switch(e.button) {
            case 0 : alert('Left button was clicked');break;
            default: return false;
        }
    });

Ответ 2

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

После поиска, e.button - это свойство, которое вы хотите запросить:

.live('click', function(e){

if ( e.button == 2 ) return false; // exit if right clicking

// normal action

});

Ответ 3

См. мой ответ здесь: если вы не возражаете немного изменить источник jQuery, добавление отдельной строки в liveHandler() полностью работает вокруг проблемы.