Что приводит к сбою обработчика событий jQuery?(Странное поведение jQuery) - PullRequest
0 голосов
/ 17 апреля 2011

Я получаю неожиданное поведение с помощью обработчика событий jQuery.Это очень похоже на проблему, обсуждаемую в этом вопросе: Почему мой обработчик событий jQuery не работает при подключении к нескольким элементам? .

По сути, упрощенный пример - моя страница вызывает

   $(document).ready(function(){
        $('a.submit').click(function(e){
              e.preventDefault();
              alert(this.href);
        });
   });

Предположим, что разметка:

<html>
    <body>
        <a href="url1" class="submit">text1</a>
        <a href="url2" class="submit">text2</a>
        <a href="url3" class="submit">text3</a>
    </body>
</html>

Все ссылки с классом отправки, кроме последней, вызывают событие.Последняя ссылка с .submit на странице не связана с обработчиком событий.Замена click(fn) на live('click',fn) работает.

Моя проблема в том, что я не понимаю, почему происходит сбой исходного обработчика.Все ссылки отображаются одновременно, и я упаковываю свою подписку обработчика в $(document).ready(), что должно обеспечить загрузку DOM.

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

Еще одна вещь, на которую стоит обратить внимание: я получаю то же странное поведение в Firefox, Chrome и IE.Я использую jQuery1.5.1

1 Ответ

0 голосов
/ 17 апреля 2011

Учитывая предоставленный вами html:

<a href="url1" class="submit">text1</a>
<a href="url2" class="submit">text2</a>
<a href="url3" class="submit">text3</a>

и JavaScript:

$(document).ready(function(){
        $('a.submit').click(function(e){
              e.preventDefault();
              alert(this.href);
        });
   });

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

$('a.submit').on('click', function(e){
    //magic here
});
...