Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么必须从集合中重新选择JQuery元素?_Javascript_Jquery - Fatal编程技术网

Javascript 为什么必须从集合中重新选择JQuery元素?

Javascript 为什么必须从集合中重新选择JQuery元素?,javascript,jquery,Javascript,Jquery,我的页面上有许多复选框,每个复选框都有一个name属性作为其有用值 我只想获取选中项的值列表。我可以得到这样的元素集合 var checkedItems = $(".checkbox:checked"); 现在我想创建列表(字符串),所以我创建了一个循环 var list = ""; for (var i = 0; i < checkedItems.length; i++) { list += $(checkedItems[i]).attr("name") + "\n"; }

我的页面上有许多复选框,每个复选框都有一个name属性作为其有用值

我只想获取选中项的值列表。我可以得到这样的元素集合

var checkedItems = $(".checkbox:checked");
现在我想创建列表(字符串),所以我创建了一个循环

var list = "";
for (var i = 0; i < checkedItems.length; i++) {
    list += $(checkedItems[i]).attr("name") + "\n";
}
但是数组肯定已经是JQuery元素的集合了吗?为什么要重播

如果有人想尝试的话,请参考工作示例

编辑:为什么这个工作

var item = $("#item");
var name = item.attr("name");

为了能够调用jQuery函数,您需要将内容包装在
$()
jQuery()

我已将示例固定在


您需要使用
list+=$(checkedItems[i]).attr(“name”)+“\n”

你问题中的列表构建代码不起作用;应该是:

for (var i = 0; i < checkedItems.length; i++)
  list += $(checkedItems[i]).attr("name") + "\n"; // or just checkedItems[i].name

checkedItems[i]
是原始DOM元素,而不是jQuery对象。
要获取集合中给定元素的jQuery对象,请调用
checkedItems.eq(i)

你可以通过写作更好地做到这一点

var list = $(".checkbox:checked")
    .map(function() { return this.name; })
    .get()
    .join('\n');

我想你实际上是这样做的:

list += $(checkedItems[i]).attr("name") + "\n";
checkedItems
是jQuery选择。它包含对所包含元素的引用。这些元素可以通过jQuery方法操作,也可以通过
checkedItems[n]
直接访问,其中
n
是一个基于0的索引

这些属性不是jQuery选择:它们是本机DOM元素。如果您想使用jQuery方法,如
attr
,则需要创建一个新的jQuery对象,包装该本地对象

在这种情况下,您可以通过使用方法避免这种情况,该方法使用数字键从原始选择中获取jQuery选择:

list += checkedItems.eq(i).attr('name') + "\n";
在您的情况下,最好结合使用
map
get
以及
Array.prototype.join

var list = checkedItems.map(function() {
    return this.name;
}).get().join('\n');

你问题中的代码是错误的,因为

$(checkedItems[i].attr("name"))
应该是

$(checkedItems[i]).attr("name")

除此之外,你真的应该这样做

var list = "";
checkedItems.each(function(){ list += this.name + '\n'; });
演示



它不起作用的原因是,当您使用
[]
访问jQuery对象中的元素时,返回的是对DOM元素的直接引用,而不是另一个jQuery对象。

修复了第一个示例,很抱歉在测试后更改回时出错。我知道这是可行的,我的意思是,在重新添加$()测试后进行位。请参阅我的编辑以了解我的其他困惑。这不是我的代码不工作的问题,我想知道为什么我必须再次显式设置-1。。。我已经发现我需要包装内容。我的问题是,为什么我需要这样做,而你没有提供答案。我只是投了反对票来反对我认为不合理的赞成票。我明白了,所以当JQuery选择器返回一个列表时,它是DOM元素的列表,而不是JQuery元素的列表?其中,作为返回一个项(如按id)的JQuery选择器,将是一个JQuery对象,并且可以直接访问属性?@musefan No。每个JQuery选择,包括一个元素或三百个元素,都只是一个引用本机DOM元素的对象
[i]
有效地将本机DOM元素从jQuery包装器中“打开”。我现在明白了,我没有意识到通过
[i]
访问会导致这种效果忘记了我代码中的打字错误(每个人似乎都想在没有正确阅读我编写的内容的情况下更正),您已经回答了实际问题,所以谢谢你;)
$(checkedItems[i]).attr("name")
var list = "";
checkedItems.each(function(){ list += this.name + '\n'; });