如何使用jQuery获取一类元素并遍历它们

在前端开发中,我们经常需要获取页面中一类元素(比如所有的图片、所有的按钮、所有的列表项等),然后对它们进行批量操作。jQuery提供了非常强大的选择器和遍历方法,让这件事变得超级简单!

本文将从获取元素遍历操作,全面讲解各种方法和最佳实践!


📖 目录

  1. 获取一类元素的方法
  2. 遍历元素的核心方法
  3. 各种遍历方式对比
  4. 实际应用场景
  5. 性能优化建议
  6. 常见问题解决

一、获取一类元素的方法 🎯

在遍历之前,我们首先要选中这类元素。jQuery提供了多种选择器:

1️⃣ 通过类名获取 ⭐最常用

javascript 复制代码
// 获取所有 class="item" 的元素
var $items = $('.item');

console.log($items.length); // 打印元素个数

2️⃣ 通过标签名获取

javascript 复制代码
// 获取所有 <div> 元素
var $divs = $('div');

// 获取所有 <img> 元素
var $imgs = $('img');

3️⃣ 通过属性获取

javascript 复制代码
// 获取所有 type="text" 的输入框
var $inputs = $('input[type="text"]');

// 获取所有 name 开头为 "user" 的元素
var $users = $('[name^="user"]');

4️⃣ 组合选择器(更精确)

javascript 复制代码
// 获取 .container 下的所有 .item
var $items = $('.container .item');

// 获取 ul > li(直接子元素)
var $lis = $('ul > li');

// 获取所有带有 data-id 属性的元素
var $items = $('[data-id]');

5️⃣ 获取元素后存储

javascript 复制代码
// ✅ 推荐:缓存jQuery对象,避免重复查询
var $buttons = $('.btn');  // 查询一次,多次使用

// ❌ 不推荐:每次都重新查询
$('.btn').css('color', 'red');
$('.btn').text('点击');     // 重复查询,性能差

二、遍历元素的核心方法 🔁

获取到元素集合后,就可以开始遍历了!

1️⃣ .each() 方法 ⭐⭐⭐最常用

语法

javascript 复制代码
$('.item').each(function(index, element) {
    // index: 当前索引(从0开始)
    // element: 当前DOM元素(原生JS对象)
    // this: 当前jQuery对象
});

示例1:修改所有元素的文本

javascript 复制代码
$('.item').each(function(index) {
    $(this).text('第' + (index + 1) + '个元素');
});

示例2:给所有图片添加点击事件

javascript 复制代码
$('img').each(function() {
    $(this).on('click', function() {
        alert('你点击了第' + ($(this).index() + 1) + '张图片');
    });
});

示例3:获取所有元素的文本并存入数组

javascript 复制代码
var texts = [];
$('.item').each(function() {
    texts.push($(this).text());
});
console.log(texts); // ["文本1", "文本2", "文本3"]

2️⃣ .map() 方法 ⭐⭐⭐返回新数组

语法

javascript 复制代码
var newArray = $('.item').map(function(index, element) {
    return $(this).text();  // 返回值会组成新数组
}).get();  // .get() 转换为原生数组

示例:提取所有价格

javascript 复制代码
var prices = $('.price').map(function() {
    return parseFloat($(this).text().replace('¥', ''));
}).get();

console.log(prices); // [19.9, 29.9, 39.9]

3️⃣ .filter() 方法 ⭐⭐⭐筛选元素

语法

javascript 复制代码
var filtered = $('.item').filter(function(index) {
    return $(this).text().length > 5;  // 返回true的元素保留
});

示例:筛选文本长度大于5的元素

javascript 复制代码
var longTexts = $('.item').filter(function() {
    return $(this).text().length > 5;
}).css('color', 'red');

4️⃣ for 循环(原生JS)

javascript 复制代码
var $items = $('.item');

for (var i = 0; i < $items.length; i++) {
    console.log($items.eq(i).text());
}

// 或使用 for...of(ES6)
for (var item of $items) {
    console.log($(item).text());
}

5️⃣ .each() 的简写方式

javascript 复制代码
// 方式1:箭头函数(ES6)
$('.item').each((index, element) => {
    console.log(index, element);
});

// 方式2:直接链式调用
$('.item')
    .each(function() {
        $(this).addClass('active');
    })
    .css('color', 'blue');

三、各种遍历方式对比 📊

方法 返回值 是否可中断 性能 适用场景
.each() jQuery对象 return false 可中断 ⭐⭐⭐ 通用遍历,需要修改元素
.map() 新数组 ❌ 不可中断 ⭐⭐⭐⭐ 提取数据,转换为数组
.filter() 筛选后的jQuery对象 ❌ 不可中断 ⭐⭐⭐⭐ 筛选符合条件的元素
for 循环 break 可中断 ⭐⭐⭐⭐⭐ 性能要求高,需要中断
for...of break 可中断 ⭐⭐⭐⭐⭐ ES6语法,简洁高效

四、实际应用场景 🎯

场景1:批量修改样式

javascript 复制代码
// 给所有 .card 添加悬停效果
$('.card').each(function() {
    $(this).hover(
        function() { $(this).css('transform', 'scale(1.05)'); },
        function() { $(this).css('transform', 'scale(1)'); }
    );
});

场景2:表单验证

javascript 复制代码
$('.required').each(function() {
    if ($(this).val() === '') {
        $(this).addClass('error');
        hasError = true;
    }
});

场景3:动态生成内容

javascript 复制代码
var html = '';
$('.item').each(function(index) {
    html += '<li>' + $(this).text() + '</li>';
});
$('#list').append(html);

场景4:获取所有选中的复选框

javascript 复制代码
var selectedValues = $('input[type="checkbox"]:checked').map(function() {
    return $(this).val();
}).get();

console.log(selectedValues); // ["value1", "value2"]

场景5:图片懒加载

javascript 复制代码
$('img[data-src]').each(function() {
    var $img = $(this);
    $img.attr('src', $img.data('src'));
});

场景6:计算总价格

javascript 复制代码
var total = 0;
$('.price').each(function() {
    total += parseFloat($(this).text().replace('¥', ''));
});
$('#total').text('总计:¥' + total.toFixed(2));

五、性能优化建议 ⚡

✅ 1. 缓存jQuery对象

javascript 复制代码
// ❌ 差:重复查询
$('.item').css('color', 'red');
$('.item').text('hello');

// ✅ 好:缓存对象
var $items = $('.item');
$items.css('color', 'red');
$items.text('hello');

✅ 2. 使用 .each() 时优先用原生JS

javascript 复制代码
// ❌ 慢:每次都创建jQuery对象
$('.item').each(function() {
    $(this).addClass('active');  // 重复创建jQuery对象
});

// ✅ 快:缓存this
$('.item').each(function() {
    var $this = $(this);  // 缓存一次
    $this.addClass('active');
    $this.css('color', 'red');
});

✅ 3. 大量元素用原生 for 循环

javascript 复制代码
// 元素超过1000个时,for循环更快
var items = $('.item');
for (var i = 0; i < items.length; i++) {
    items.eq(i).addClass('active');
}

✅ 4. 使用 .map().get() 替代 .each() 推数组

javascript 复制代码
// ❌ 慢
var arr = [];
$('.item').each(function() {
    arr.push($(this).text());
});

// ✅ 快
var arr = $('.item').map(function() {
    return $(this).text();
}).get();

六、常见问题解决 🔧

❌ 问题1:遍历后元素没有变化

原因 :在 .each() 中使用了 this 而不是 $(this)

解决

javascript 复制代码
// ❌ 错
$('.item').each(function() {
    this.text('hello');  // this是DOM对象,没有.text()方法
});

// ✅ 对
$('.item').each(function() {
    $(this).text('hello');  // 包装成jQuery对象
});

❌ 问题2:如何中断 .each() 循环?

解决 :使用 return false

javascript 复制代码
$('.item').each(function() {
    if ($(this).text() === '停止') {
        return false;  // 中断循环(相当于break)
    }
    console.log($(this).text());
});

❌ 问题3:如何跳过当前元素(continue)?

解决 :使用 return truereturn

javascript 复制代码
$('.item').each(function() {
    if ($(this).hasClass('skip')) {
        return;  // 跳过当前元素,继续下一个(相当于continue)
    }
    console.log($(this).text());
});

❌ 问题4:遍历得到的索引从1开始?

解决index 从0开始,需要+1

javascript 复制代码
$('.item').each(function(index) {
    console.log(index + 1);  // 输出 1, 2, 3...
});

💡 总结:该用哪个方法?

需求 推荐方法
通用遍历,修改元素 .each()
提取数据转为数组 .map().get() ⭐⭐
筛选符合条件的元素 .filter() ⭐⭐
性能要求高,需要中断 for 循环 / for...of ⭐⭐⭐
链式调用 .each() + 链式方法 ⭐⭐

🎁 一句话总结

日常开发用 .each() 最方便,提取数据用 .map(),筛选用 .filter(),性能优先用原生 for 循环!


🔥 速查表

javascript 复制代码
// 获取元素
var $items = $('.item');

// 遍历并修改
$items.each(function() {
    $(this).css('color', 'red');
});

// 提取数据
var texts = $items.map(function() {
    return $(this).text();
}).get();

// 筛选元素
var filtered = $items.filter(function() {
    return $(this).text().length > 5;
});

// 中断循环
$items.each(function() {
    if (条件) return false;  // 中断
    if (条件) return;        // 跳过
});

觉得有用?点赞收藏不迷路 ❤️

有问题欢迎评论区交流! 💬

相关推荐
csdn小瓯1 小时前
AI质量评估体系:LLM-as-a-Judge实现与自动化测试实战
前端·网络·人工智能
jiayong231 小时前
第 43 课:任务详情抽屉里的批量处理闭环与删除联动
java·开发语言·前端
likerhood1 小时前
Java 访问修饰符:public、protected、private讲解
java·开发语言·javascript
刀法如飞2 小时前
JavaScript 数组去重的 20 种实现方式,学会用不同思路解决问题
前端·javascript·算法
小江的记录本2 小时前
【AI大模型选型指南】《2026年5月(最新版)国内外主流AI大模型选型指南》(个人版)
前端·人工智能·后端·ai·aigc·ai编程·ai写作
@PHARAOH2 小时前
HOW - 前端输入场景支持拼音匹配
前端
计算机安禾2 小时前
【c++面向对象编程】第21篇:运算符重载基础:语法、规则与不可重载的运算符
java·前端·c++
__log2 小时前
Vue 3 核心技术深度解析:从“会用API“到“懂原理、能表达“
前端·javascript·vue.js