JQuery только возвращает первый элемент - PullRequest
9 голосов
/ 13 мая 2010

По какой-то странной причине, когда у меня есть селектор и я ожидаю получить несколько элементов, jQuery возвращает только первый элемент вместо всей коллекции.

Это HTML-код, который у меня есть:

<a id="reply-424880" class="reply" href="#" rel="nofollow">Reply</a>
<a id="reply-424885" class="reply" href="#" rel="nofollow">Reply</a>

И селектор:

$('.reply').unbind('click').click(function(event) {
 ...
}

Я пробовал отладку с помощью FireBug, и все еще получаю те же результаты.Используя обходной путь, я могу заставить его работать:

$('a').each(function (index, element) {
            if ($(element).attr('class') == 'reply') {
                $(this).unbind('click').click(function(event) {
                     ...
                });
             }
});

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

Ответы [ 4 ]

20 голосов
/ 21 марта 2014

Неловко, у меня тоже была эта проблема, и оказалось, что в Chrome, похоже, есть функция, подобная j (jquery) $ (), которая аналогичным образом реализует подмножество логики селектора, но при этом отсутствует набор функций:

> $
function $(selector, [startNode]) { [Command Line API] }

Vs с JQuery правильно включены:

> $
function (e,n){return new x.fn.init(e,n,t)} 

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

Надеюсь, это сэкономит кому-то время.

3 голосов
/ 13 мая 2010

То, что у вас уже должно работать, вы можете увидеть пример здесь , это простой вызов:

$('.reply').unbind('click').click(function(event) {
  alert('hi there');
});​

У вас должно быть что-то вне вопроса, влияющее на ваши ссылки, если один и тот же обработчик не выполняется для всех из них. Если вы получаете атрибут только с первого раза, убедитесь, что внутри вашей функции вы не делаете что-то вроде $(".reply").attr("id"), вы должны использовать this внутри обработчика , из которого вы получите атрибут первого найденного элемента.

Вот пример :

$('.reply').unbind('click').click(function(event) {
  alert($('.reply').attr("id")); //alerts "reply-424880" for both
});​

Так должно быть :

$('.reply').unbind('click').click(function(event) {
  alert($(this).attr("id")); //alerts "reply-424880" for both
  //and use just this.id in this case, no need for jQuery .attr(), like this
  //alert(this.id);
});​
1 голос
/ 23 августа 2010

Оставив обходной путь на пару месяцев, я решил попытаться выяснить, не было ли на странице что-то, что вызывало проблему.

В процессе устранения я смог сузить ошибку до файла jquery.validate.js. По какой-то неизвестной причине этот файл заставлял jQuery возвращать только первое значение. Я скачал последнюю версию, и селекторы теперь возвращают все соответствующие элементы.

0 голосов
/ 13 мая 2010

Это должно работать, но как насчет ...

$('.reply').each(function() { 
   $(this).unbind('click').click(function(event) {
      ... 
   });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...