jquery foreach(长文讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

前言

在 JavaScript 开发中,遍历数据结构是基础且高频的操作。而 jQuery 提供的 each() 方法,凭借其简洁的语法和强大的功能,成为开发者处理集合数据时的得力工具。无论是遍历 DOM 元素、数组还是对象,each() 都能以直观的方式简化代码逻辑。本文将从基础语法到高级用法,结合实例和常见场景,帮助读者全面掌握 jQuery foreach 的核心技巧。


一、理解 jQuery 的 each() 方法

1.1 each() 的基本语法

each() 是 jQuery 提供的核心遍历方法,其语法结构如下:

$(selector).each(function(index, element) {  
  // 在此编写遍历逻辑  
});
  • 参数说明
    • index:当前元素在集合中的索引(从 0 开始)。
    • element:当前遍历到的元素(可以是 DOM 对象或数组项)。
  • 返回值:遍历完成后返回原始 jQuery 对象,支持链式调用。

形象比喻
可以把 each() 想象成一位“快递分拣员”,它会逐个“扫描”选中的元素或数据项,并按照开发者定义的规则进行处理,例如修改样式、执行计算或触发事件。


1.2 与原生 JavaScript 的对比

在原生 JavaScript 中,遍历数组通常使用 for 循环或 forEach() 方法:

// 原生 JavaScript 遍历数组  
let arr = [10, 20, 30];  
arr.forEach((item, index) => {  
  console.log(`索引 ${index} 的值为 ${item}`);  
});  

而 jQuery 的 each() 语法更接近原生 forEach(),但其优势在于可以直接操作 jQuery 对象中的 DOM 元素,例如:

// jQuery 遍历 DOM 元素  
$("div").each(function(index) {  
  $(this).css("background-color", "yellow");  
});  

关键区别

  • jQuery 的 each() 同时支持遍历 DOM 集合和普通数组/对象。
  • 原生 JavaScript 需要分别处理 DOM 和非 DOM 数据。

二、基础应用场景:遍历 DOM 元素

2.1 修改元素样式或属性

假设页面中有多个 <p> 标签,目标是为每个段落添加不同的背景色:

<p>段落1</p>  
<p>段落2</p>  
<p>段落3</p>  

使用 each() 实现:

$("p").each(function(index) {  
  const colors = ["red", "green", "blue"];  
  $(this).css("background-color", colors[index]);  
});  

执行效果

  • 索引 0 的段落背景为红色,1 为绿色,2 为蓝色。

2.2 动态生成内容

若需根据数据动态渲染 HTML,例如将数组中的项目显示为列表:

const items = ["苹果", "香蕉", "橙子"];  
let html = "";  

$(items).each(function(index, item) {  
  html += `<li>${item}</li>`;  
});  

$("ul").append(html);  

关键点

  • 通过 $(items) 将普通数组转换为 jQuery 对象,再调用 each()
  • 使用字符串拼接生成 HTML 片段,最后一次性插入页面,避免频繁操作 DOM。

三、进阶技巧:遍历数组与对象

3.1 遍历普通数组

除了 DOM 元素,each() 也适用于非 jQuery 对象的数组:

const numbers = [1, 2, 3, 4, 5];  
let sum = 0;  

$(numbers).each(function(index, num) {  
  sum += num;  
});  

console.log("总和:" + sum); // 输出:15  

3.2 遍历对象属性

对于对象,each() 可以遍历其键值对:

const person = {  
  name: "Alice",  
  age: 25,  
  city: "New York"  
};  

$(person).each(function(key, value) {  
  console.log(`${key}: ${value}`);  
});  

输出结果

name: Alice  
age: 25  
city: New York  

四、高级用法与注意事项

4.1 提前终止循环

若在遍历过程中需提前退出,可以通过返回 false 实现:

$("div").each(function(index) {  
  if (index === 2) {  
    return false; // 当索引为2时终止循环  
  }  
  $(this).css("border", "1px solid black");  
});  

4.2 使用 this 上下文

each() 的回调函数中,this 指向当前遍历的原生 DOM 元素。若需使用 jQuery 方法,需包装为 $(this)

// 错误示例:直接调用 jQuery 方法  
$(this).css("color", "red"); // 正确  
this.css("color", "red");    // 错误,原生元素无此方法  

五、实际案例:表单验证

5.1 需求背景

假设有一个包含多个输入框的表单,要求验证所有字段是否填写:

<form id="myForm">  
  <input type="text" name="username" required>  
  <input type="email" name="email" required>  
  <input type="text" name="phone" required>  
  <button type="submit">提交</button>  
</form>  

5.2 使用 each() 实现验证

$("#myForm").submit(function(e) {  
  e.preventDefault(); // 阻止默认提交  

  let isValid = true;  

  $(this).find("input[required]").each(function() {  
    if ($(this).val().trim() === "") {  
      $(this).css("border", "2px solid red");  
      isValid = false;  
    } else {  
      $(this).css("border", "");  
    }  
  });  

  if (isValid) {  
    alert("提交成功!");  
  }  
});  

功能说明

  • 遍历表单中所有带有 required 属性的输入框。
  • 若字段为空,标记红色边框并标记表单无效。
  • 若所有字段有效,弹出成功提示。

六、性能优化与常见问题

6.1 避免频繁操作 DOM

在循环中直接修改 DOM 会显著降低性能。建议将结果先存储在变量中,最后一次性更新:

// 低效写法:  
$("div").each(function() {  
  $(this).append("<p>新内容</p>"); // 每次循环都触发重绘  
});  

// 优化写法:  
let html = "";  
$("div").each(function() {  
  html += "<p>新内容</p>";  
});  
$("div").append(html); // 一次性插入内容  

6.2 注意作用域问题

each() 回调函数中定义的变量,默认属于外层作用域,需避免意外覆盖:

var result = [];  

$("li").each(function() {  
  var text = $(this).text(); // 局部变量,安全  
  // ...  
});  

// 若误用全局变量:  
// text = $(this).text(); // 会污染全局作用域  

结论

通过本文的讲解,读者应已掌握 jQuery foreach 的核心方法 each(),并能将其应用于 DOM 操作、数据遍历和表单验证等场景。无论是初学者还是中级开发者,理解 each() 的工作原理和最佳实践,都能显著提升代码的简洁性和可维护性。

实践建议

  1. 在真实项目中尝试用 each() 替代复杂的 for 循环。
  2. 通过控制台逐步调试遍历逻辑,观察 indexelement 的变化。
  3. 结合性能优化技巧,避免因循环导致的页面卡顿。

掌握 each() 仅仅是开始,后续可进一步探索 jQuery 的其他遍历方法(如 map()filter()),逐步构建更高效、优雅的 JavaScript 代码。

最新发布