jquery:为什么选择器返回一个数组,但属性不是?

时间:2010-04-15 13:11:12

标签: jquery arrays jquery-selectors

我正在努力更好地理解JQ。 我正在调用JQ对象

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

这会向我返回一个数组,其中包含其span父母的兄弟拥有类名的所有选项。

[option, option]

现在 - 我想返回一个选项值的数组

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

这只返回给我第一个子值和一个完整的值数组。

为什么?

我很高兴得到帮助并更好地了解jq :)。

感谢。

5 个答案:

答案 0 :(得分:9)

我能提供的最佳答案是“这就是API的工作方式”。我同意你的观点,如“attr”和“val”之类的东西如果返回数组会更加一致(至少在选择器匹配多个元素的情况下)。

如果您愿意,可以使用$.map获得该效果:

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

现在“attrs”将是一个数组。你也可以编写自己的函数。

在任何情况下,重要的是要注意有数组,然后有“jQuery对象”。如果你考虑一下,那么在一组jQuery操作的 middle 中使用“attr”或“val”(或类似的东西)永远不会有意义。

答案 1 :(得分:3)

实际上,$(selector)不返回数组。 $(selector)的结果是一个jQuery对象,它被定义为“一组匹配的元素”。这个集合可以包含0个,一个或多个“元素”,但jQuery本身仍然是一个单独的对象。只是一个无法容纳任何东西的盒子。

那么,如果$(...)没有返回数组,那么attr()或val()返回它的原因是什么?这就是为什么属性getter总是(?)返回它们所应用的jQuery对象中 first 元素的属性。

答案 2 :(得分:1)

尝试

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

答案 3 :(得分:1)

您可以使用.map()执行此操作,如下所示:

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

这将得到[value1, value2, value3],这是所选选项值的数组。

答案 4 :(得分:0)

你不是在寻找像

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

Afaik,attr()方法不适用于多个对象,因此您需要在返回的对象上调用each()。