🎯 选择器基础 >>>
jQuery 选择器是整个库的核心,掌握基本选择器、层级选择器、过滤选择器是高效操作 DOM 的前提。
基本选择器
$("*"):选择所有元素$("tag") $("div"):标签选择器,如$(".class"):类选择器$("#id"):ID 选择器$("selector1, selector2"):多选择器
// 选择所有段落
$("p").css("color", "red");
// 选择多个元素
$("h1, h2, h3").addClass("header");
// 组合选择器
$("div.container p.active")
层级选择器
$("parent child"):后代选择器$("parent > child"):子选择器$("prev + next"):相邻兄弟选择器$("prev ~ siblings"):后续兄弟选择器
// 后代选择器:所有后代
$("div p");
// 子选择器:直接子元素
$("ul > li");
// 相邻兄弟
$("h1 + p");
// 后续所有兄弟
$("h1 ~ p");
过滤选择器
:first :last:第一个 / 最后一个:even :odd:偶数 / 奇数(从 0 开始):eq(n):索引为 n 的元素:gt(n) :lt(n):大于 / 小于索引 n:not(selector):排除匹配元素:contains(text):包含指定文本:has(selector):包含匹配元素的元素:empty :parent:无子元素 / 有子元素
// 第一个段落
$("p:first");
// 偶数索引的列表项
$("li:even");
// 索引为 2
$("li:eq(2)");
// 不包含 active 类的
$("div:not(.active)");
// 包含 "hello" 的段落
$("p:contains('hello')");
属性选择器
$("[attr]"):有指定属性$("[attr='value']"):属性等于值- `$("[attr!='value']") : 属性不等于值
$("[attr^='value']"):属性以值开头$("[attr$='value']"):属性以值结尾$("[attr*='value']"):属性包含值
// 有 title 属性的链接
$("a[title]");
// href 以 https 开头
$("a[href^='https']");
// src 以 .png 结尾的图片
$("img[src$='.png']");
// class 包含 btn
$("[class*='btn']");
🎨 DOM 操作 >>>
DOM 操作是 jQuery 最常用的功能,包括创建、插入、删除、复制元素,以及属性、样式、内容的读写。
创建与插入
$("<div>"):创建元素.append(content):内部末尾插入.prepend(content):内部开头插入.after(content):外部后面插入.before(content):外部前面插入.appendTo(target):插入到目标内部末尾.prependTo(target):插入到目标内部开头.insertAfter(target):插入到目标后面.insertBefore(target):插入到目标前面
// 创建元素
const $div = $("<div class='box'>新元素</div>");
// 内部插入
$("#container").append($div);
$("#container").prepend("<p>开头</p>");
// 外部插入
$("#target").after("<div>后面</div>");
$("#target").before("<div>前面</div>");
// 移动元素
$("#moveMe").appendTo("#container");
删除与清空
.remove():删除元素(保留事件绑定).empty():清空子元素.detach():删除元素(保留数据和事件).unwrap():移除父元素
// 删除元素
$("#element").remove();
// 条件删除
$("p").remove(".test");
// 清空内容
$("#container").empty();
// 移除并保留数据
const $elem = $("#widget").detach();
// ... 后续可以重新插入
$("#newParent").append($elem);
克隆
.clone():浅克隆(不含事件).clone(true):深克隆(包含事件和数据)
// 克隆元素
const $clone = $("#template").clone();
// 深克隆(包含事件)
const $deepClone = $("#widget").clone(true);
// 插入克隆
$("#container").append($clone);
属性操作
.attr(name):获取属性.attr(name, value):设置属性.attr({name: value}):批量设置.removeAttr(name):移除属性.prop(name):获取属性(布尔属性).prop(name, value):设置属性.val():获取表单值.val(value):设置表单值
// 获取属性
const href = $("a").attr("href");
const checked = $("#checkbox").prop("checked");
// 设置属性
$("img").attr("src", "image.png");
$("a").attr({
href: "https://example.com",
target: "_blank"
});
// 移除属性
$("div").removeAttr("title");
// 表单值
const text = $("input[name='username']").val();
$("input[name='username']").val("新值");
类名操作
.addClass(name):添加类名.removeClass(name):移除类名.toggleClass(name):切换类名.hasClass(name):是否有类名
// 添加类名
$("div").addClass("active");
$("div").addClass("box highlight");
// 移除类名
$("div").removeClass("active");
// 切换类名
$("button").toggleClass("selected");
// 条件切换
$("div").toggleClass("active", isActive);
// 检查类名
if ($("#box").hasClass("active")) {
console.log("已激活");
}
内容操作
.html():获取 HTML 内容.html(content):设置 HTML 内容.text():获取文本内容.text(content):设置文本内容
// 获取内容
const html = $("#container").html();
const text = $("#container").text();
// 设置内容
$("#container").html("<p>新的 <strong>HTML</strong></p>");
$("#container").text("纯文本内容");
// 安全设置(防 XSS)
$("#output").text(userInput);
📡 事件处理 >>>
jQuery 提供了统一的事件 API,简化了跨浏览器的事件绑定、解绑和触发,支持事件委托和自定义事件。
绑定事件
.on(event, handler):绑定事件.on(event, selector, handler):事件委托.on(event, data, handler):绑定事件并传递数据.one(event, handler):绑定一次性事件
// 基本绑定
$("#button").on("click", function(e) {
console.log("点击了");
});
// 多个事件
$("#input").on("focus blur", function() {
$(this).toggleClass("focused");
});
// 事件委托
$("#list").on("click", "li", function() {
console.log($(this).text());
});
// 传递数据
$("#button").on("click", { name: "jQuery" }, function(e) {
console.log(e.data.name);
});
// 一次性事件
$("#alert").one("click", function() {
alert("只触发一次");
});
解绑事件
.off(event):解绑事件.off(event, handler):解绑特定处理函数.off():解绑所有事件
// 解绑特定事件
$("#button").off("click");
// 解绑特定处理函数
const handler = function() { console.log("click"); };
$("#button").on("click", handler);
$("#button").off("click", handler);
// 解绑所有事件
$("#element").off();
触发事件
.trigger(event):触发事件.triggerHandler(event):触发事件(不执行默认行为)
// 触发事件
$("#button").trigger("click");
// 触发事件并传参
$("#input").trigger("customEvent", ["参数1", "参数2"]);
// 只触发处理函数,不执行默认行为
$("#form").triggerHandler("submit");
快捷方法
.click(handler):点击事件.dblclick(handler):双击事件.hover(enter, leave):悬停事件.focus(handler):获得焦点.blur(handler):失去焦点.change(handler):值改变.submit(handler):表单提交.keydown(handler):键盘按下.keyup(handler):键盘抬起.mousedown(handler):鼠标按下.mouseup(handler):鼠标抬起.mousemove(handler):鼠标移动.mouseenter(handler):鼠标进入(不冒泡).mouseleave(handler):鼠标离开(不冒泡).mouseover(handler):鼠标悬停(冒泡).mouseout(handler):鼠标离开(冒泡)
// 点击事件
$("#button").click(function() {
alert("点击了");
});
// 悬停事件
$("#box").hover(
function() {
$(this).addClass("hover");
},
function() {
$(this).removeClass("hover");
}
);
// 表单提交
$("#form").submit(function(e) {
e.preventDefault();
console.log("提交表单");
});
// 键盘事件
$("#input").keydown(function(e) {
if (e.which === 13) {
console.log("回车键");
}
});
事件对象
e.preventDefault():阻止默认行为e.stopPropagation():阻止冒泡e.stopImmediatePropagation():阻止后续处理e.target:触发事件的元素e.currentTarget:当前处理元素e.delegateTarget:委托元素e.which:键码 / 鼠标键e.pageX e.pageY:鼠标页面坐标e.type:事件类型
$("#link").click(function(e) {
// 阻止默认行为
e.preventDefault();
// 阻止冒泡
e.stopPropagation();
// 获取信息
console.log("事件类型:", e.type);
console.log("触发元素:", e.target);
console.log("当前元素:", e.currentTarget);
console.log("鼠标位置:", e.pageX, e.pageY);
});
✨ 动画效果 >>>
jQuery 内置了常用的动画效果,也支持自定义动画,通过链式调用可以创建复杂的动画序列。
显示与隐藏
.show():显示元素.hide():隐藏元素.toggle():切换显示/隐藏.show(duration):带动画显示.hide(duration):带动画隐藏.toggle(duration):带动画切换
// 立即显示/隐藏
$("#box").show();
$("#box").hide();
$("#box").toggle();
// 带动画
$("#box").show(1000); // 1秒
$("#box").hide("slow"); // slow/normal/fast
$("#box").toggle(400, function() {
console.log("动画完成");
});
淡入淡出
.fadeIn():淡入.fadeOut():淡出.fadeToggle():切换淡入/淡出.fadeTo(duration, opacity):淡到指定透明度
// 淡入
$("#box").fadeIn();
$("#box").fadeIn(1000);
// 淡出
$("#box").fadeOut("slow");
// 切换
$("#box").fadeToggle(400);
// 淡到 0.5 透明度
$("#box").fadeTo(1000, 0.5);
滑动
.slideDown():向下滑动显示.slideUp():向上滑动隐藏.slideToggle():切换滑动
// 向下滑动显示
$("#menu").slideDown();
// 向上滑动隐藏
$("#menu").slideUp("fast");
// 切换
$("#menu").slideToggle(300, function() {
console.log("滑动完成");
});
自定义动画
.animate(properties):自定义动画.animate(properties, duration):指定时长.animate(properties, options):详细配置
// 基本动画
$("#box").animate({
left: "250px",
opacity: 0.5,
height: "150px"
}, 1000);
// 使用相对值
$("#box").animate({
left: "+=50px",
opacity: "-=0.2"
});
// 完整配置
$("#box").animate({
width: "300px"
}, {
duration: 1000,
easing: "swing", // swing/linear
complete: function() {
console.log("完成");
},
step: function(now) {
console.log("当前值:", now);
}
});
动画控制
.stop():停止当前动画.stop(true):清除队列.stop(true, true):清除队列并跳到结尾.finish():完成所有队列动画.delay(duration):延迟执行
// 停止动画
$("#box").stop();
// 停止并清除队列
$("#box").stop(true);
// 停止、清除队列、跳到结尾
$("#box").stop(true, true);
// 完成所有动画
$("#box").finish();
// 延迟
$("#box")
.fadeOut(500)
.delay(1000)
.fadeIn(500);
🌐 AJAX 请求 >>>
jQuery 的 AJAX 方法简化了异步请求,支持 Promise 风格的链式调用,提供了丰富的配置选项和全局事件。
核心方法
$.ajax(options):底层 AJAX 方法$.get(url, data, success):GET 请求$.post(url, data, success):POST 请求$.getJSON(url, data, success):获取 JSON$.getScript(url, success):加载脚本$(selector).load(url, data, complete):加载 HTML
// $.ajax 完整配置
$.ajax({
url: "/api/data",
method: "POST",
data: { name: "jQuery", version: "4.0" },
dataType: "json",
timeout: 5000,
beforeSend: function(xhr) {
console.log("发送前");
},
success: function(data, status, xhr) {
console.log("成功:", data);
},
error: function(xhr, status, error) {
console.error("错误:", error);
},
complete: function(xhr, status) {
console.log("完成");
}
});
// Promise 风格
$.ajax({ url: "/api/data" })
.done(function(data) {
console.log("成功:", data);
})
.fail(function(xhr, status, error) {
console.error("失败:", error);
})
.always(function() {
console.log("总是执行");
});
快捷方法
// GET 请求
$.get("/api/data", function(data) {
console.log(data);
});
// POST 请求
$.post("/api/data", { name: "test" }, function(data) {
console.log(data);
});
// 获取 JSON
$.getJSON("/api/data.json", function(data) {
console.log(data);
});
// 加载 HTML
$("#container").load("/page.html #content");
配置选项
url:请求地址method type:请求方法(GET/POST/PUT/DELETE)data:发送的数据(对象或字符串)dataType:预期响应类型(json/xml/html/script/jsonp/text)contentType:发送数据的类型headers:自定义请求头timeout:超时时间(毫秒)async:是否异步(默认 true)cache:是否缓存(默认 true)processData:是否处理数据(默认 true)traditional:是否传统序列化(默认 false)
$.ajax({
url: "/api/data",
method: "POST",
data: JSON.stringify({ id: 1 }),
contentType: "application/json",
dataType: "json",
headers: {
"Authorization": "Bearer token123"
},
timeout: 10000,
cache: false
});
全局事件
$(document).ajaxStart(handler):请求开始$(document).ajaxStop(handler):请求结束$(document).ajaxSuccess(handler):请求成功$(document).ajaxError(handler):请求失败$(document).ajaxComplete(handler):请求完成$(document).ajaxSend(handler):请求发送前
// 全局加载提示
$(document).ajaxStart(function() {
$("#loading").show();
});
$(document).ajaxStop(function() {
$("#loading").hide();
});
// 全局错误处理
$(document).ajaxError(function(e, xhr, settings, error) {
console.error("请求失败:", settings.url, error);
});
序列化
.serialize():序列化为查询字符串.serializeArray():序列化为数组$.param(object):对象序列化
// 序列化表单
const data = $("form").serialize();
// name=John&age=30
// 序列化为数组
const arr = $("form").serializeArray();
// [{ name: "name", value: "John" }, { name: "age", value: "30" }]
// 对象序列化
const str = $.param({ a: 1, b: 2 });
// a=1&b=2
🛠️ 工具函数 >>>
jQuery 提供了丰富的工具函数,用于类型检测、对象操作、数组处理和字符串处理,简化了常见的编程任务。
类型检测
$.type(value):获取类型(jQuery 4 已移除,用原生 typeof)$.isArray(obj):是否数组(jQuery 4 已移除,用 Array.isArray)$.isFunction(obj):是否函数$.isNumeric(value):是否数字$.isEmptyObject(obj):是否空对象$.isPlainObject(obj):是否纯对象$.isWindow(obj):是否 window$.contains(container, contained):是否包含
// jQuery 4 推荐:使用原生方法
Array.isArray([1, 2, 3]); // true
typeof function() {} === "function"; // true
typeof 123 === "number"; // true
// jQuery 仍支持的方法
$.isEmptyObject({}); // true
$.isPlainObject({ a: 1 }); // true
$.contains(document, document.body); // true
对象操作
$.extend(target, source):合并对象$.extend(true, target, source):深拷贝合并$.each(object, callback):遍历对象
// 浅拷贝合并
const obj = $.extend({}, { a: 1 }, { b: 2 });
// { a: 1, b: 2 }
// 深拷贝合并
const deep = $.extend(true, {}, {
a: { b: 1 }
}, {
a: { c: 2 }
});
// { a: { b: 1, c: 2 } }
// 遍历对象
$.each({ a: 1, b: 2 }, function(key, value) {
console.log(key + ": " + value);
});
数组处理
$.each(array, callback):遍历数组$.map(array, callback):映射数组$.grep(array, callback):过滤数组$.inArray(value, array):查找索引$.merge(array1, array2):合并数组$.unique(array):去重(仅 DOM 元素)$.makeArray(obj):转数组
// 遍历数组
$.each([1, 2, 3], function(index, value) {
console.log(index + ": " + value);
});
// 映射数组
const doubled = $.map([1, 2, 3], function(val, i) {
return val * 2;
});
// [2, 4, 6]
// 过滤数组
const filtered = $.grep([1, 2, 3, 4, 5], function(val, i) {
return val > 2;
});
// [3, 4, 5]
// 查找索引
const index = $.inArray(3, [1, 2, 3, 4]);
// 2
// 合并数组
const merged = $.merge([1, 2], [3, 4]);
// [1, 2, 3, 4]
// 转数组
const arr = $.makeArray(document.getElementsByTagName("div"));
字符串处理
$.trim(str):去除首尾空白(jQuery 4 已移除,用原生 trim)$.parseJSON(json):解析 JSON(jQuery 4 已移除,用 JSON.parse)$.parseHTML(html):解析 HTML$.parseXML(xml):解析 XML
// jQuery 4 推荐:使用原生方法
" hello ".trim(); // "hello"
JSON.parse('{"a":1}'); // { a: 1 }
// jQuery 方法
const $elems = $.parseHTML("<div>HTML</div>");
const xmlDoc = $.parseXML("<root><item/></root>");
其他工具
$.proxy(fn, context):绑定上下文$.noop:空函数$.now():当前时间戳(jQuery 4 已移除,用 Date.now)$.holdReady(hold):暂停 ready 事件
// 绑定上下文
const obj = { name: "jQuery" };
const fn = $.proxy(function() {
console.log(this.name);
}, obj);
// 空函数(作为默认回调)
function callback(fn) {
(fn || $.noop)();
}
// jQuery 4 推荐:使用原生方法
Date.now(); // 当前时间戳
🔗 链式调用与遍历 >>>
jQuery 的链式调用和强大的遍历方法让 DOM 操作更简洁,可以快速定位和过滤元素集合。
链式调用
// 链式调用示例
$("#box")
.addClass("active")
.css("color", "red")
.fadeIn(500)
.delay(1000)
.fadeOut(500);
过滤方法
.eq(index):选择指定索引.first():第一个元素.last():最后一个元素.filter(selector):过滤匹配元素.not(selector):排除匹配元素.slice(start, end):切片.has(selector):包含匹配元素.is(selector):是否匹配
// 选择索引为 2
$("li").eq(2);
// 第一个和最后一个
$("li").first();
$("li").last();
// 过滤
$("li").filter(".active");
$("li").not(".disabled");
// 切片(索引 1 到 3)
$("li").slice(1, 4);
// 包含子元素
$("div").has("p");
// 是否匹配
if ($("div").is(".active")) {
console.log("已激活");
}
查找方法
.find(selector):查找后代.children(selector):查找子元素.parent(selector):查找父元素.parents(selector):查找所有祖先.parentsUntil(selector):查找祖先直到.closest(selector):查找最近的匹配祖先.next(selector):下一个兄弟.nextAll(selector):后续所有兄弟.nextUntil(selector):后续兄弟直到.prev(selector):上一个兄弟.prevAll(selector):之前所有兄弟.prevUntil(selector):之前兄弟直到.siblings(selector):所有兄弟
// 查找后代
$("#container").find("p");
// 子元素
$("#list").children(".item");
// 父元素
$("#item").parent();
$("#item").parents(".container");
// 最近的匹配祖先
$("#item").closest(".wrapper");
// 兄弟元素
$("#item").next();
$("#item").nextAll();
$("#item").prev();
$("#item").siblings();
遍历方法
.each(callback):遍历元素.map(callback):映射元素.get():转为 DOM 数组.get(index):获取指定 DOM 元素.index():获取索引
// 遍历元素
$("li").each(function(index, elem) {
console.log(index + ": " + $(this).text());
});
// 映射元素
const texts = $("li").map(function() {
return $(this).text();
}).get();
// 转为 DOM 数组
const domArray = $("div").get();
// 获取指定 DOM 元素
const firstDiv = $("div").get(0);
// 获取索引
const index = $("#item").index();
其他方法
.add(selector):添加元素到集合.addBack():添加之前的集合.contents():获取所有子节点(包括文本节点).end():结束当前链,返回上一个集合
// 添加元素到集合
$("div").add("p").css("color", "red");
// 添加之前的集合
$("div").find("p").addBack().addClass("container");
// 结束链
$("div")
.find("p")
.addClass("para")
.end()
.addClass("container");