如何解决jQuery的.each()方法每次运行都返回最后一个值的问题?
如何阻止.each()方法每次运行时都选中最后一个值?
嘿,我来帮你捋清楚这个问题~
你代码里的问题其实很典型:你的addedClass变量在each循环里被反复覆盖了。咱们拆解一下:
- 你用
$("#list li").each()遍历所有li元素,每一次循环都会根据当前li的类修改addedClass的值 - 等整个
each循环跑完,addedClass只会保留最后一个li对应的类名 - 后面的
for循环是在each完全结束后才执行的,所以所有添加的<p>标签都会用这个最终的类,自然就全变成最后那个值了
另外还有个小细节:你原来的append语句里,HTML属性的引号写法有问题,会导致语法错误,这个我也一起帮你修正了。
下面分两种常见需求给你解决方案:
需求1:只要有任意一个li带one类,所有p都用red类,否则用blue类
这种情况根本不需要遍历所有li,直接检查是否存在符合条件的元素就行,效率更高:
var array = ["test1", "test2", "test3"]; // 直接判断是否存在带one类的li var addedClass = $("#list li.one").length > 0 ? "red" : "blue"; for (var i = 0; i < array.length; i++) { // 修正引号问题,用单引号包裹class属性值 $("#results").append("<p class='" + addedClass + "'>" + array[i] + "</p>"); }
需求2:数组的每个元素对应一个li的类(假设数组长度和li数量一致)
这种情况要把数组的处理逻辑放到each循环内部,利用循环的index参数对应数组的索引,同时把addedClass的作用域限制在循环里,避免被覆盖:
var array = ["test1", "test2", "test3"]; $("#list li").each(function(index) { // 把变量声明在循环内部,每次循环都是独立的 var addedClass = $(this).hasClass("one") ? "red" : "blue"; $("#results").append("<p class='" + addedClass + "'>" + array[index] + "</p>"); });
核心思路就是:要么提前拿到最终结果,避免循环覆盖变量,要么把变量的作用域限制在单次循环内,及时使用当前值。这样就不会出现总是取最后一个值的问题啦~
内容的提问来源于stack exchange,提问作者medglabe
相关产品推荐
相关产品推荐

