jQuery возвращает только первый элемент

По какой-то странной причине, когда у меня есть селектор и я ожидаю получить несколько элементов, 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) {
                     ...
                });
             }
});

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


person Cloud SME    schedule 13.05.2010    source источник
comment
Действительно ли console.log( $('.reply') ) возвращает только один элемент?   -  person Tomalak    schedule 13.05.2010
comment
Вы уверены, что проблема в этом (возвращается только один элемент)? Что возвращает $('.reply').length?   -  person JohnFx    schedule 13.05.2010
comment
На этой странице у меня есть 51 ссылка на странице и 7 ссылок с ответом класса. $('.ответ').длина; возвращает 1 и $('a').length; return 51 У меня есть эта проблема на 2 других страницах, которые не связаны с ответами. Возможно, что-то на моей странице мешает работе селектора, но не знаю, на что обратить внимание.   -  person Cloud SME    schedule 13.05.2010
comment
Другие ответчики правы, ваш пример правильный. Вы можете предоставить полную страницу для тестирования. Или удалите часть контента из него, но, пожалуйста, убедитесь, что он по-прежнему не прошел тест. Пока нет ошибки для обсуждения.   -  person Nikita Rybak    schedule 13.05.2010
comment
Кстати, вместо использования if ($(element).attr('class') == 'reply') используйте `if ($(element).hasClass(reply)`   -  person adardesign    schedule 13.05.2010


Ответы (4)


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

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

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

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

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

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

person Jon Marnock    schedule 21.03.2014
comment
Кстати, в Chrome также есть функция $$, которая возвращает массив элементов, соответствующих селектору. Подробнее здесь. - person Jthorpe; 30.05.2016
comment
@Jthorpe, это просто потрясающе, может быть, стоит задать собственный вопрос о хроме и ответить на него. Большое спасибо - person Snowball; 11.04.2017
comment
Почему они выбрали '$' для этого? - person cori; 29.03.2018

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

$('.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);
});​
person Nick Craver    schedule 13.05.2010
comment
Да, я не вижу, где они могут ошибаться... Определенно простой звонок. +1 - person Gabe; 13.05.2010

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

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

person Cloud SME    schedule 23.08.2010

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

$('.reply').each(function() { 
   $(this).unbind('click').click(function(event) {
      ... 
   });
});
person Gabe    schedule 13.05.2010
comment
это не проблема, - person Daniel Santos; 26.02.2018