jquery:为啥选择器返回我一个数组,但属性没有?

Posted

技术标签:

【中文标题】jquery:为啥选择器返回我一个数组,但属性没有?【英文标题】:jquery: why a selector returns me an array, but attribute doesnt?jquery:为什么选择器返回我一个数组,但属性没有? 【发布时间】:2011-02-08 09:14:48 【问题描述】:

我正在努力更好地理解 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 :)

谢谢。

【问题讨论】:

不同的方法对单个或多个元素起作用确实是不一致的。这不是 API 中唯一的不一致之处。没有什么要理解的了……如果 jQuery 的界面中有任何可以理解的哲学,那只是“让我们尽可能多地向$() 中添加不同的功能,该死的一致性”。 【参考方案1】:

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

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

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

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

无论如何,重要的是要注意有数组,然后有“jQuery 对象”。如果您考虑一下,在一组 jQuery 操作的中间中使用“attr”或“val”(或类似的东西)永远不会真正有意义。

【讨论】:

谢谢你,感谢这个线程中的每个人回答我。 在你的最后一段中没有让你太过分。为什么没有意义?这将返回一个对象 $(".FamiliesList li li span[class!='']")。它是一个属性选择器。为什么没关系?毕竟我是用 jq 来匹配 DOM 元素的,不就是她被创造出来的吗? “jQuery 对象”是支持所有 jQuery 函数的专用数组,对象的“数组”部分的元素是一组匹配的 DOM 节点。考虑到 jQuery 的整体架构,拥有一个数组值类似于“attr”结果的 jQuery 对象并没有真正的意义。【参考方案2】:

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

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

【讨论】:

这里变聪明了。我仍然认为这种不一致很奇怪。如果我可以通过属性返回选择器的对象,为什么我不能通过方法匹配?像 attr() 会返回第一个孩子,但 [attr=*] 不会?【参考方案3】:

试试

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

【讨论】:

【参考方案4】:

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

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

这将获得[value1, value2, value3],一个包含所选选项值的数组。

【讨论】:

【参考方案5】:

你不是在寻找类似的东西

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

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

【讨论】:

应该是$(this) 而不是this 这里也应该提到快捷方式.val()

以上是关于jquery:为啥选择器返回我一个数组,但属性没有?的主要内容,如果未能解决你的问题,请参考以下文章

模拟Jquery选择器

为啥 jQuery 3 不能识别属性选择器中的“#”字符?

为啥 jQuery 选择器在这里不起作用?

jQuery 属性等于选择器不适用于自定义属性

为啥这个 jQuery 选择器这么慢?

jQuery 总是返回数组吗?