使用jquery循环访问列表项

我有这块代码

listItems = $("#productList").find("li"); for (var li in listItems) { var product = $(li); var productid = product.children(".productId").val(); var productPrice = product.find(".productPrice").val(); var productMSRP = product.find(".productMSRP").val(); totalItemsHidden.val(parseInt(totalItemsHidden.val(), 10) + 1); subtotalHidden.val(parseFloat(subtotalHidden.val()) + parseFloat(productMSRP)); savingsHidden.val(parseFloat(savingsHidden.val()) + parseFloat(productMSRP - productPrice)); totalHidden.val(parseFloat(totalHidden.val()) + parseFloat(productPrice)); } 

我没有得到预期的结果 – totalItems出来了180+,其余全部是NaN。 我怀疑它在哪里使用var product = $(li); 或者也许在循环本身的expression。 无论哪种方式 – 我需要循环<ul>标记为#productList

你需要使用.each

 var listItems = $("#productList li"); listItems.each(function(idx, li) { var product = $(li); // and the rest of your code }); 

这是循环jQueryselect的正确方法。

你可以使用这个:

 $('#productList li').each(function(i, li) { var $product = $(li); // your code goes here }); 

这就是说 – 你确定你想每次更新值为+1? 难道你不能find计数,然后设置基于这个值?

尝试这个:

 listItems = $("#productList").find("li").each(function(){ var product = $(this); // rest of code. }); 

试试这个代码。 通过使用父>子select器“#productList李”它应该find所有李元素。 然后,可以使用each()方法遍历结果对象,该方法只会改变已经find的li元素。

 listItems = $("#productList li").each(function(){ var product = $(this); var productid = product.children(".productId").val(); var productPrice = product.find(".productPrice").val(); var productMSRP = product.find(".productMSRP").val(); totalItemsHidden.val(parseInt(totalItemsHidden.val(), 10) + 1); subtotalHidden.val(parseFloat(subtotalHidden.val()) + parseFloat(productMSRP)); savingsHidden.val(parseFloat(savingsHidden.val()) + parseFloat(productMSRP - productPrice)); totalHidden.val(parseFloat(totalHidden.val()) + parseFloat(productPrice)); }); 

为了得到更明确的答案,您需要发布一些标记。 你可以简化你的jQuery相当多,如下所示:

 $("#productList li").each(function() { var product = $(this); var productid = $(".productId", product).val(); var productPrice = $(".productPrice", product).val(); var productMSRP = $(".productMSRP", product).val(); // the rest remains unchanged } 

要解决这个问题,不用jQuery .each()你必须修改你的代码,如下所示:

 var listItems = $("#productList").find("li"); var ind, len, product; for ( ind = 0, len = listItems.length; ind < len; ind++ ) { product = $(listItems[ind]); // ... } 

错误在您的原始的代码:

  1. for ... in也会遍历所有inheritance的属性; 即你也将获得由jQuery定义的所有函数的列表。

  2. 循环variablesli不是列表项,而是列表项的索引 。 在这种情况下,索引是一个正常的数组索引(即整数)

基本上你是保存使用.each()因为它更舒适,但特别是当你循环更大的数组时,这个答案中的代码将更快。

对于.each()其他select,你可以看看这个性能比较: http : .each()