jQuery, живой ('щелчок'), стреляющий для щелчка правой кнопкой

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

, Так как Вы не можете полагаться на тесты для репродуцирования ошибки, необходимо использовать дедуктивное обоснование для обнаружения ошибки. Это в свою очередь требует глубокого понимания того, как система работает (например, как модель памяти Java работает и что является возможными источниками ошибок параллелизма).

Вот пример ошибки параллелизма в Guice 1.0, которого я определил местоположение только несколько дней назад. Можно протестировать навыки нахождения ошибки путем попытки узнать то, что является ошибкой, вызывающей то исключение. Ошибка не слишком трудна для нахождения - я нашел ее причину приблизительно в 15-30 минут (ответ здесь ).

java.lang.NullPointerException 
    at com.google.inject.InjectorImpl.injectMembers(InjectorImpl.java:673) 
    at com.google.inject.InjectorImpl$8.call(InjectorImpl.java:682) 
    at com.google.inject.InjectorImpl$8.call(InjectorImpl.java:681) 
    at com.google.inject.InjectorImpl.callInContext(InjectorImpl.java:747) 
    at com.google.inject.InjectorImpl.injectMembers(InjectorImpl.java:680) 
    at ...

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

9
задан nickf 28 September 2009 в 23:26
поделиться

4 ответа

Это известная проблема :

Похоже, Firefox не запускает событие щелчка для элемента на щелкните правой кнопкой мыши, хотя он запускает mousedown и mouseup. Однако это запускает событие щелчка для документа ! Поскольку .live ловит события на уровне документа, он видит событие щелчка для элемента даже хотя сам элемент этого не делает. Если вы используете такое событие, как mouseup, оба элемент p и документ будет видеть событие.

Ваш обходной путь - лучшее, что вы можете сделать на данный момент. Похоже, что это влияет только на Firefox (я считаю, что на самом деле это ошибка Firefox, а не jQuery как таковой).

См. Также , этот вопрос задан вчера.

9
ответ дан 4 December 2019 в 13:03
поделиться

Я нашел решение - "исправить" сам код live () .

В унифицированном исходном коде jQuery 1.3.2 около строки 2989 есть функция с именем liveHandler () . Измените код, чтобы добавить одну строку:

2989:    function liveHandler(event) {
2990:        if (event.type == 'click' && event.button != 0) return true;

Это остановит срабатывание событий щелчка на чем-либо, кроме левой кнопки мыши. Если вы особенно хотите, вы можете легко изменить код, чтобы разрешить события «щелчка правой кнопкой мыши», но это работает для меня, так что он остается на этом уровне.

4
ответ дан 4 December 2019 в 13:03
поделиться

Это неудачное последствие реализации live . На самом деле он использует восходящую цепочку событий, поэтому вы не привязываетесь к событию щелчка элемента привязки, вы привязываетесь к событию щелчка документа.

0
ответ дан 4 December 2019 в 13:03
поделиться

Фактически вы можете переписать его как:

function reattachEvents(){
    $(element).unbind('click').click(function(){
        //do something
    });
}

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

3
ответ дан 4 December 2019 в 13:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: