jquery: почему селектор возвращает мне массив, а атрибут нет? - PullRequest
4 голосов
/ 15 апреля 2010

Я пытаюсь лучше понять JQ. Я вызываю объект JQ

$(".FamiliesList li li span[class!='']").prev().find('option:selected')

возвращает мне массив всех опций, которые у брата их родительского диапазона есть имя класса.

[option, option]

Теперь я хочу вернуть массив значений параметра

$(".FamiliesList li li span[class!='']").prev().find('option:selected').attr('value')

это возвращает мне только первое дочернее значение и полный массив значений.

Почему?

Буду признателен за помощь и лучше пойму jq:)

Спасибо.

Ответы [ 5 ]

9 голосов
/ 15 апреля 2010

Лучший ответ, который я могу предложить, это «так работает API». Я согласен с вами, что такие вещи, как "attr" и "val" были бы более последовательными, если бы они возвращали массивы (по крайней мере, в случае, когда селектор соответствует нескольким элементам).

Вы можете получить этот эффект с помощью $.map, если хотите:

var attrs = $.map($('div.something'), function(element) {
  return $(element).attr('whatever');
});

Теперь "attrs" будет массивом. Вы также можете написать свою собственную функцию.

В любом случае важно отметить, что есть массивы, а затем есть «объекты jQuery». На самом деле никогда не будет смысла использовать attr или val (или что-то в этом роде) в middle набора операций jQuery, если вы об этом думаете.

3 голосов
/ 15 апреля 2010

На самом деле, $ (селектор) не возвращает массив. Результатом $ (селектор) является объект jQuery, который определяется как «набор соответствующих элементов». Этот набор может содержать 0, один или несколько «элементов», но сам jQuery остается одним объектом. Просто коробка, которая ничего не может вместить.

Итак, если $ (...) не возвращает массив, что может быть причиной для его возврата attr () или val ()? Вот почему методы получения свойств всегда (?) Возвращают свойства первого элемента в объекте jQuery, к которому они применяются.

1 голос
/ 15 апреля 2010

Вы можете сделать это, используя .map(), например:

var values = $(".FamiliesList li li span[class!='']").prev()
               .find('option:selected').map(function(function() {
                 return $(this).attr('value');
               }).get();

Это получит [value1, value2, value3], массив значений выбранных опций.

1 голос
/ 15 апреля 2010

попробуй

$(".FamiliesList li li span[class!='']").prev().find('option:selected').each(function () { return $(this).attr('value'); });`
0 голосов
/ 15 апреля 2010

Разве вы не искали бы что-то вроде

$(".FamiliesList li li span[class!='']").prev().find('option:selected').each(function() {
  return this.attr('value');
});

Afaik, метод attr () не работает с несколькими объектами, поэтому вам нужно вызывать each () для возвращаемых объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...