jQuery 基本操作详解:选择器、DOM 操作与样式控制全指南
jQuery 是一款经典的 JavaScript 库,其核心价值在于 “简化 DOM 操作、统一浏览器兼容性、提供便捷的工具方法”。掌握 jQuery 的基本操作(选择器、DOM 增删改、属性与样式控制)是高效开发前端页面的基础。从 “jQuery 对象基础→选择器体系→DOM 操作→样式与属性控制” 四个维度,系统讲解 jQuery 的核心用法与实战技巧,帮你快速上手 jQuery 开发。
jQuery 基础:引入与对象概念
在使用 jQuery 前,需先理解 “如何引入库” 和 “jQuery 对象与 DOM 对象的区别”—— 这是避免后续操作报错的关键。
1. 引入 jQuery 库
jQuery 是外部库,需通过 <script> 标签引入后才能使用,常见引入方式有两种:
(1)本地引入(推荐开发环境)
将 jQuery 文件下载到本地项目,通过相对路径引入:
1 | <!-- 引入本地 jQuery 文件(版本为 3.5.1,可替换为其他版本) --> |
(2)CDN 引入(推荐生产环境)
通过公共 CDN(如百度、谷歌、BootCDN)直接引入,无需下载文件,加载速度快:
1 | <!-- 百度 CDN 引入 jQuery 3.5.1 --> |
版本选择:
- 1.x 版本:兼容 IE 6/7/8 等旧浏览器,功能稳定;
- 2.x/3.x 版本:不兼容旧 IE,体积更小、性能更好(推荐现代项目使用)。
2. jQuery 对象与 DOM 对象的互转
jQuery 操作的是 “jQuery 对象”(通过 $() 包装 DOM 对象得到),而非原生 “DOM 对象”,二者方法不能混用(如 DOM 对象的 innerHTML 不能在 jQuery 对象上使用)。
(1)DOM 对象 → jQuery 对象
通过 $(DOM 对象) 包装即可将原生 DOM 对象转为 jQuery 对象:
1 | // 1. 获取原生 DOM 对象 |
(2)jQuery 对象 → DOM 对象
jQuery 对象是 “类数组对象”,可通过数组下标或 get(index) 方法获取原生 DOM 对象:
1 | // 1. 获取 jQuery 对象(匹配所有 button 标签) |
关键约定:
为区分 jQuery 对象和 DOM 对象,通常在 jQuery 对象变量前加 $ 前缀(如 $btn、$list)—— 这是行业通用约定,可提升代码可读性。
3. 文档就绪事件($(function()))
与原生 JS 的 window.onload 类似,jQuery 提供 $(function()) 确保 “DOM 加载完成后再执行代码”,避免因 DOM 未解析导致的元素获取失败。
语法对比:
| 方式 | 触发时机 | 执行次数 | 优势 |
|---|---|---|---|
$(function()) |
DOM 解析完成后执行(无需等待图片、样式表) | 可多次执行 | 执行时机早、支持多回调 |
window.onload |
整个页面(图片、样式表)加载完成后执行 | 仅执行最后一个 | 兼容性好(适合旧浏览器) |
示例:
1 | // jQuery 文档就绪事件(推荐写法) |
jQuery 核心:选择器体系
选择器是 jQuery 定位 DOM 元素的 “工具”,通过简洁的语法匹配页面中的元素。jQuery 选择器体系丰富,可分为基本选择器、层次选择器、过滤选择器、表单选择器四大类,覆盖绝大多数定位场景。
1. 基本选择器(按 ID、Class、标签定位)
基本选择器是最常用的选择器,通过元素的 id、class 或标签名匹配元素,语法与 CSS 选择器一致。
| 选择器语法 | 作用描述 | 示例 | 匹配结果 |
|---|---|---|---|
#id |
匹配指定 id 的元素(id 唯一) |
$("#content") |
匹配 id="content" 的元素 |
.class |
匹配指定 class 的所有元素 |
$(".active") |
匹配所有 class="active" 的元素 |
element |
匹配指定标签名的所有元素 | $("div") |
匹配所有 <div> 标签 |
* |
匹配页面中所有元素 | $("*") |
匹配所有元素(慎用,性能较低) |
selector1,selector2 |
匹配多个选择器的结果(并列) | $("#content, .active") |
匹配 id="content" 和 class="active" 的元素 |
示例:
1 | <div id="content">内容区</div> |
2. 层次选择器(按 DOM 层级定位)
层次选择器通过元素在 DOM 树中的 “父子、后代、兄弟关系” 匹配元素,适合定位嵌套或相邻的元素。
| 选择器语法 | 作用描述 | 示例 | 匹配结果 |
|---|---|---|---|
ancestor descendant |
匹配祖先元素下的所有后代元素(包括子、孙) | $("div span") |
匹配 <div> 下所有 <span>(无论嵌套层级) |
parent > child |
匹配父元素下的直接子元素(仅一级) | $("div > span") |
匹配 <div> 直接子级的 <span>(孙级不匹配) |
prev + next |
匹配紧接在 prev 后的第一个兄弟元素 |
$("p + span") |
匹配 <p> 后面紧邻的第一个 <span> |
prev ~ siblings |
匹配 prev 后面的所有兄弟元素 |
$("p ~ span") |
匹配 <p> 后面所有 <span>(无需紧邻) |
示例:
1 | <div id="content"> |
补充:兄弟元素方法
除选择器外,jQuery 还提供方法简化兄弟元素定位:
$element.next():等价于prev + next,获取下一个兄弟元素;$element.nextAll():等价于prev ~ siblings,获取后面所有兄弟元素;$element.siblings():获取所有兄弟元素(无论前后)。
3. 过滤选择器(按条件筛选元素)
过滤选择器通过 “索引、内容、可见性、属性” 等条件筛选元素,语法以 : 开头,是 jQuery 选择器的核心特色。
(1)基本过滤选择器(按索引或状态筛选)
| 选择器语法 | 作用描述 | 示例 | 匹配结果 |
|---|---|---|---|
:first |
匹配第一个元素 | $("li:first") |
匹配所有 <li> 中的第一个 |
:last |
匹配最后一个元素 | $("li:last") |
匹配所有 <li> 中的最后一个 |
:not(selector) |
排除匹配 selector 的元素 |
$("li:not(.active)") |
匹配所有 <li> 中 class 不是 active 的元素 |
:even |
匹配索引为偶数的元素(索引从 0 开始) | $("li:even") |
匹配 <li> 索引 0、2、4… 的元素 |
:odd |
匹配索引为奇数的元素(索引从 0 开始) | $("li:odd") |
匹配 <li> 索引 1、3、5… 的元素 |
:eq(index) |
匹配索引等于 index 的元素 |
$("li:eq(2)") |
匹配 <li> 索引为 2 的元素(第三个) |
:gt(index) |
匹配索引大于 index 的元素 |
$("li:gt(2)") |
匹配 <li> 索引 > 2 的元素 |
:lt(index) |
匹配索引小于 index 的元素 |
$("li:lt(2)") |
匹配 <li> 索引 < 2 的元素 |
:header |
匹配所有标题元素(h1~h6) | $(":header") |
匹配页面中所有 <h1> 到 <h6> 标签 |
:focus |
匹配当前获得焦点的元素 | $(":focus") |
匹配当前聚焦的输入框、按钮等 |
示例:
1 | <ul> |
(2)内容过滤选择器(按元素内容筛选)
根据元素的文本内容或子元素特征匹配元素:
| 选择器语法 | 作用描述 | 示例 | 匹配结果 |
|---|---|---|---|
:contains(text) |
匹配包含指定文本的元素 | $("p:contains('jQuery')") |
匹配所有包含 “jQuery” 文本的 <p> 标签 |
:empty |
匹配无文本且无子元素的元素 | $("div:empty") |
匹配空 <div>(如 <div></div>) |
:has(selector) |
匹配包含指定子元素的元素 | $("div:has(.active)") |
匹配包含 class="active" 子元素的 <div> |
:parent |
匹配有文本或有子元素的元素(与 :empty 相反) |
$("div:parent") |
匹配非空 <div> |
示例:
1 | <div class="box">包含文本的 div</div> |
(3)属性过滤选择器(按元素属性筛选)
根据元素是否有指定属性或属性值匹配元素,语法以 [] 括起:
| 选择器语法 | 作用描述 | 示例 | 匹配结果 |
|---|---|---|---|
[attribute] |
匹配有指定属性的元素 | $("input[id]") |
匹配所有有 id 属性的 <input> 标签 |
[attribute=value] |
匹配属性值等于 value 的元素 |
$("input[name='username']") |
匹配 name="username" 的 <input> |
[attribute!=value] |
匹配属性值不等于 value 的元素 |
$("input[name!='username']") |
匹配 name 不是 username 的 <input> |
[attribute^=value] |
匹配属性值以 value 开头的元素 |
$("input[name^='user']") |
匹配 name 以 user 开头的 <input>(如 username、userage) |
[attribute$=value] |
匹配属性值以 value 结尾的元素 |
$("input[name$='name']") |
匹配 name 以 name 结尾的 <input>(如 username、realname) |
[attribute*=value] |
匹配属性值包含 value 的元素 |
$("input[name*='ser']") |
匹配 name 包含 ser 的 <input>(如 username) |
[attr1][attr2=value] |
匹配同时满足多个属性条件的元素 | $("input[id][name='age']") |
匹配有 id 属性且 name="age" 的 <input> |
示例:
1 | <input type="text" name="username" id="user1"> |
(4)表单选择器(专门定位表单元素)
为表单元素量身定制的选择器,简化表单元素定位:
| 选择器语法 | 作用描述 | 示例 | 匹配结果 |
|---|---|---|---|
:input |
匹配所有表单元素(input、textarea、select、button) | $(":input") |
匹配所有表单元素 |
:text |
匹配单行文本框(type="text") |
$(":text") |
匹配所有单行文本框 |
:password |
匹配密码框(type="password") |
$(":password") |
匹配所有密码框 |
:radio |
匹配单选框(type="radio") |
$(":radio") |
匹配所有单选框 |
:checkbox |
匹配复选框(type="checkbox") |
$(":checkbox") |
匹配所有复选框 |
:submit |
匹配提交按钮(type="submit") |
$(":submit") |
匹配所有提交按钮 |
:reset |
匹配重置按钮(type="reset") |
$(":reset") |
匹配所有重置按钮 |
:button |
匹配普通按钮(type="button" 或 <button>) |
$(":button") |
匹配所有普通按钮 |
:file |
匹配文件上传框(type="file") |
$(":file") |
匹配所有文件上传框 |
示例:
1 | <form id="loginForm"> |
jQuery DOM 操作:增删改查
jQuery 简化了原生 DOM 的增删改操作,提供了直观的方法用于 “创建节点、插入节点、删除节点、替换节点”。
1. 创建节点
通过 $(HTML 字符串) 直接创建 DOM 节点,并包装为 jQuery 对象:
1 | $(function() { |
2. 插入节点
创建节点后,需通过插入方法将其添加到文档树中。jQuery 提供两类插入方法(“内部插入” 和 “外部插入”),满足不同位置需求。
(1)内部插入(添加到元素内部)
将节点添加到目标元素的 “内部开头” 或 “内部结尾”:
| 方法名 | 作用描述 | 示例 |
|---|---|---|
$parent.append($child) |
将 $child 追加到 $parent 内部结尾 | $("#cityList").append($newLi) |
$child.appendTo($parent) |
将 $child 追加到 $parent 内部结尾(反向) | $newLi.appendTo($("#cityList")) |
$parent.prepend($child) |
将 $child 插入到 $parent 内部开头 | $("#cityList").prepend($newLi) |
$child.prependTo($parent) |
将 $child 插入到 $parent 内部开头(反向) | $newLi.prependTo($("#cityList")) |
示例:
1 | <ul id="cityList"> |
(2)外部插入(添加到元素外部)
将节点添加到目标元素的 “前面” 或 “后面”:
| 方法名 | 作用描述 | 示例 |
|---|---|---|
$target.after($newNode) |
将 $newNode 插入到 $target 后面 | $("#beijing").after($newLi) |
$newNode.insertAfter($target) |
将 $newNode 插入到 $target 后面(反向) | $newLi.insertAfter($("#beijing")) |
$target.before($newNode) |
将 $newNode 插入到 $target 前面 | $("#shanghai").before($newLi) |
$newNode.insertBefore($target) |
将 $newNode 插入到 $target 前面(反向) | $newLi.insertBefore($("#shanghai")) |
示例:
1 | <ul id="cityList"> |
3. 删除节点
jQuery 提供两种删除节点的方法,区别在于是否保留元素本身:
| 方法名 | 作用描述 | 示例 |
|---|---|---|
$element.remove() |
删除 $element 及其所有子节点(完全移除) | $("#beijing").remove() |
$element.empty() |
清空 $element 的所有子节点(保留自身) | $("#cityList").empty() |
示例:
1 | <ul id="cityList"> |
4. 替换节点
通过 replaceWith() 或 replaceAll() 替换已有节点:
1 | $(function() { |
jQuery 属性与样式控制
jQuery 提供便捷的方法用于 “操作元素属性、文本内容、样式”,无需手动处理原生 DOM 的属性读写差异。
1. 文本与 HTML 内容操作
| 方法名 | 作用描述 | 示例 |
|---|---|---|
$element.text() |
读取元素的文本内容(不含 HTML 标签) | var text = $("#box").text(); |
$element.text(value) |
设置元素的文本内容(HTML 标签会被转义) | $("#box").text("新文本"); |
$element.html() |
读取元素的 HTML 内容(含 HTML 标签) | var html = $("#box").html(); |
$element.html(value) |
设置元素的 HTML 内容(HTML 标签会解析) | $("#box").html("<p>新 HTML</p>"); |
$element.val() |
读取表单元素的 value 属性(如输入框、下拉框) | var username = $("input[name='username']").val(); |
$element.val(value) |
设置表单元素的 value 属性 | $("input[name='username']").val("张三"); |
示例:
1 | <div id="box">原始文本 <span>带标签</span></div> |
2. 元素属性操作
通过 attr() 和 removeAttr() 操作元素的自定义属性或原生属性:
| 方法名 | 作用描述 | 示例 |
|---|---|---|
$element.attr(name) |
读取元素的指定属性值 | var id = $("#box").attr("id"); |
$element.attr(name, value) |
设置元素的指定属性值 | $("#box").attr("class", "active"); |
$element.attr({name1: value1, name2: value2}) |
批量设置属性 | $("#box").attr({id: "newBox", title: "新盒子"}); |
$element.removeAttr(name) |
删除元素的指定属性 | $("#box").removeAttr("class"); |
示例:
1 | <img id="img1" src="old.jpg" alt="旧图片"> |
3. 样式操作
jQuery 提供四类样式操作方法,覆盖 “添加、移除、切换、判断” 场景:
| 方法名 | 作用描述 | 示例 |
|---|---|---|
$element.addClass(className) |
为元素添加一个或多个类(多个类用空格分隔) | $("#box").addClass("active big"); |
$element.removeClass(className) |
为元素移除一个或多个类 | $("#box").removeClass("active"); |
$element.toggleClass(className) |
切换元素的类(有则移除,无则添加) | $("#box").toggleClass("active"); |
$element.hasClass(className) |
判断元素是否包含指定类(返回布尔值) | var hasActive = $("#box").hasClass("active"); |
$element.css(property) |
读取元素的 CSS 样式值 | var color = $("#box").css("color"); |
$element.css(property, value) |
设置元素的 CSS 样式 | $("#box").css("color", "red"); |
$element.css({prop1: val1, prop2: val2}) |
批量设置 CSS 样式 | $("#box").css({color: "red", fontSize: "16px"}); |
示例:
1 | <style> |
总结与最佳实践
1. 核心总结
- jQuery 对象:通过 前缀;
- 选择器:优先使用 CSS 兼容选择器(如
#id、.class),复杂场景用过滤选择器,避免过度依赖:eq等索引选择器(易因 DOM 结构变化失效); - DOM 操作:创建节点后批量设置属性,再插入文档(减少重排);删除节点用
remove()/empty(),避免内存泄漏; - 属性与样式:文本用
text(),HTML 用html(),表单值用val();样式优先用addClass()/removeClass()(便于维护),而非直接css()。
2. 最佳实践建议
缓存选择器结果:避免重复调用选择器(如
$("#box")),将结果保存在变量中:1
2
3
4
5
6
7
8// 低效:重复调用选择器
$("#box").text("文本1");
$("#box").css("color", "red");
// 高效:缓存选择器结果
var $box = $("#box");
$box.text("文本1");
$box.css("color", "red");链式调用:jQuery 方法支持链式调用,简化代码:
1
2
3
4
5// 链式调用:一次完成多个操作
$("#box")
.text("链式调用")
.css("color", "blue")
.addClass("active");避免使用
\*选择器:$("*")匹配所有元素,性能较低,如需全局操作,可缩小范围(如$("body *"))。事件绑定简化:后续学习 jQuery 事件时,可结合选择器直接绑定事件(如
$("button").click(function() {})),无需单独获取元素