jquery:为什么选择器返回一个数组,而属性不返回?
我正在努力更好地理解JQ。 我正在调用一个JQ对象jquery:为什么选择器返回一个数组,而属性不返回?,jquery,arrays,jquery-selectors,Jquery,Arrays,Jquery Selectors,我正在努力更好地理解JQ。 我正在调用一个JQ对象 $(".FamiliesList li li span[class!='']").prev().find('option:selected') 这将返回给我一个包含所有选项的数组,这些选项的跨度父级的兄弟有一个类名 [option, option] 现在-我想返回一个选项值数组 $(".FamiliesList li li span[class!='']").prev().find('option:selected').attr('valu
$(".FamiliesList li li span[class!='']").prev().find('option:selected')
这将返回给我一个包含所有选项的数组,这些选项的跨度父级的兄弟有一个类名
[option, option]
现在-我想返回一个选项值数组
$(".FamiliesList li li span[class!='']").prev().find('option:selected').attr('value')
这只返回给我第一个子值和一个完整的值数组
为什么?
如果能得到帮助并更好地理解jq,我将不胜感激:)
谢谢。试试看
$(".FamiliesList li li span[class!='']").prev().find('option:selected').each(function () { return $(this).attr('value'); });`
你不是在找类似的东西吗
$(".FamiliesList li li span[class!='']").prev().find('option:selected').each(function() {
return this.attr('value');
});
好吧,attr()方法不能处理多个对象,因此您需要对返回的对象调用每个()方法。我能提供的最佳答案是,“这就是API的工作方式”。我同意您的看法,如果“attr”和“val”返回数组(至少在选择器匹配多个元素的情况下),它们会更加一致 如果需要,可以使用
$.map
获得该效果:
var attrs = $.map($('div.something'), function(element) {
return $(element).attr('whatever');
});
现在“attrs”将是一个数组。您也可以编写自己的函数
在任何情况下,需要注意的是,有数组,然后是“jQuery对象”。如果你想一想,在一组jQuery操作的中间使用“Atter”或“Vall”(或类似的东西)永远不会有意义。 你可以这样使用:
var values = $(".FamiliesList li li span[class!='']").prev()
.find('option:selected').map(function(function() {
return $(this).attr('value');
}).get();
这将获得所选选项值的数组。实际上,$(选择器)不返回数组。$(选择器)的结果是一个jQuery对象,它被定义为“一组匹配的元素”。这个集合可以包含0个、一个或多个“元素”,但jQuery本身仍然是一个对象。只是一个什么也装不下的盒子
那么,如果$(…)不返回数组,attr()或val()返回数组的原因是什么?这就是为什么属性getter总是(?)返回应用它们的jQuery对象中第一个元素的属性。不同的方法对单个或多个元素起作用确实是不一致的。这不是API中唯一的不一致之处。没有什么比这更需要理解的了。。。如果jQuery的界面中有任何可以理解的理念的话,那就是“让我们尽可能多地将不同的特性加入
$()
,一致性被诅咒”。应该是$(this)
而不是this
快捷方式.val()
应该在这里提及,谢谢你,谢谢这篇文章中的每个人回答我。在你的最后一段中,没有让你了解太多。为什么没有意义?这将返回一个对象$(“.FamiliesList li li span[class!=”)”。它是一个属性选择器。为什么没关系?毕竟我使用jq来匹配DOM元素,这不是因为她被创建了吗?“jQuery对象”是一个支持所有jQuery函数的专用数组,对象的“数组”部分的元素是一组匹配的DOM节点。考虑到jQuery的整体架构,使用数组值类似于“attr”结果的jQuery对象是没有意义的。我仍然认为这种不一致是奇怪的。如果我可以通过属性返回选择器的对象,为什么我不能通过方法匹配?like attr()将返回第一个子级,但[attr=*]不会返回?