|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
引言
jQuery作为最流行的JavaScript库之一,极大地简化了HTML文档遍历、事件处理、动画设计和Ajax交互。在网页开发中,元素查询是操作DOM的基础,掌握jQuery的元素查询技巧不仅能提高开发效率,还能写出更加优雅、高效的代码。本文将从基础选择器到高级过滤方法,全面解析jQuery元素查找和操作,帮助你成为前端开发高手。
jQuery基础选择器
基本选择器
基本选择器是jQuery中最常用也是最简单的选择器,它们基于CSS1-3选择器,并进行了扩展。
ID选择器通过元素的ID属性来选取元素,使用#符号表示。
- // 选取ID为"myId"的元素
- $("#myId")
- // 实际应用示例
- $("#header").css("background-color", "#f0f0f0");
复制代码
类选择器通过元素的class属性来选取元素,使用.符号表示。
- // 选取所有class为"myClass"的元素
- $(".myClass")
- // 实际应用示例
- $(".button").click(function() {
- alert("按钮被点击了");
- });
复制代码
元素选择器根据元素的名称选取元素。
- // 选取所有的<p>元素
- $("p")
- // 实际应用示例
- $("div").addClass("container");
复制代码
通用选择器*选取所有元素。
- // 选取文档中的所有元素
- $("*")
- // 实际应用示例 - 设置所有元素的边框
- $("*").css("border", "1px solid #ddd");
复制代码
多元素选择器允许你同时选择多个不同类型的元素,用逗号分隔。
- // 选取所有的<p>和<div>元素
- $("p, div")
- // 实际应用示例
- $("h1, h2, h3").css("color", "blue");
复制代码
层次选择器
层次选择器基于元素之间的关系来选取元素。
后代选择器选取指定元素的所有后代元素,用空格分隔。
- // 选取<form>元素内所有的<input>元素
- $("form input")
- // 实际应用示例
- $("#container p").css("margin-bottom", "10px");
复制代码
子元素选择器选取指定元素的直接子元素,用>符号表示。
- // 选取<ul>元素的直接子元素<li>
- $("ul > li")
- // 实际应用示例
- $("div > p").addClass("direct-child");
复制代码
相邻兄弟选择器选取紧接在指定元素后的第一个兄弟元素,用+符号表示。
- // 选取紧接在<div>后的第一个<p>元素
- $("div + p")
- // 实际应用示例
- $("h2 + p").css("font-weight", "bold");
复制代码
一般兄弟选择器选取指定元素之后的所有兄弟元素,用~符号表示。
- // 选取<div>元素之后的所有<p>兄弟元素
- $("div ~ p")
- // 实际应用示例
- $("h1 ~ p").css("text-indent", "20px");
复制代码
jQuery高级过滤方法
jQuery提供了丰富的过滤方法,帮助你更精确地选取需要的元素。
基础过滤方法
:first选取第一个元素,:last选取最后一个元素。
- // 选取第一个<p>元素
- $("p:first")
- // 选取最后一个<li>元素
- $("li:last")
- // 实际应用示例
- $("tr:first").css("background-color", "#yellow");
- $("tr:last").css("background-color", "#f0f0f0");
复制代码
:even选取索引为偶数的元素(从0开始),:odd选取索引为奇数的元素。
- // 选取索引为偶数的<tr>元素
- $("tr:even")
- // 选取索引为奇数的<tr>元素
- $("tr:odd")
- // 实际应用示例 - 表格斑马纹
- $("tr:even").css("background-color", "#f9f9f9");
- $("tr:odd").css("background-color", "#ffffff");
复制代码
:eq(index)选取索引等于index的元素,:gt(index)选取索引大于index的元素,:lt(index)选取索引小于index的元素。
- // 选取索引为2的<li>元素
- $("li:eq(2)")
- // 选取索引大于2的<li>元素
- $("li:gt(2)")
- // 选取索引小于2的<li>元素
- $("li:lt(2)")
- // 实际应用示例
- $("div:eq(1)").hide(); // 隐藏第二个div
- $("li:gt(4)").css("color", "red"); // 将索引大于4的li文字设为红色
- $("p:lt(3)").addClass("highlight"); // 为前三个p元素添加高亮类
复制代码
:not(selector)选取不符合指定选择器的元素。
- // 选取所有class不是"special"的<p>元素
- $("p:not(.special)")
- // 实际应用示例
- $("input:not(:checked)").css("border", "1px solid red");
复制代码
:header选取所有的标题元素,如h1, h2, h3等。
- // 选取所有的标题元素
- $(":header")
- // 实际应用示例
- $(":header").css("font-family", "Arial, sans-serif");
复制代码
内容过滤方法
:contains(text)选取包含指定文本的元素。
- // 选取包含文本"jQuery"的<p>元素
- $("p:contains('jQuery')")
- // 实际应用示例
- $("div:contains('重要信息')").css("border", "2px solid red");
复制代码
:empty选取不包含子元素或文本的空元素。
- // 选取所有空的<td>元素
- $("td:empty")
- // 实际应用示例
- $("td:empty").text("N/A").css("color", "#999");
复制代码
:has(selector)选取含有选择器所匹配的元素的元素。
- // 选取含有<p>元素的<div>元素
- $("div:has(p)")
- // 实际应用示例
- $("li:has(ul)").css("font-weight", "bold"); // 为包含子列表的列表项加粗
复制代码
:parent选取含有子元素或文本的元素。
- // 选取所有含有子元素或文本的<td>元素
- $("td:parent")
- // 实际应用示例
- $("td:parent").css("padding", "10px");
复制代码
可见性过滤方法
:visible选取所有可见的元素,:hidden选取所有隐藏的元素。
- // 选取所有可见的<p>元素
- $("p:visible")
- // 选取所有隐藏的<div>元素
- $("div:hidden")
- // 实际应用示例
- $("div:visible").click(function() {
- $(this).fadeOut("slow");
- });
- $("button").click(function() {
- $("div:hidden").fadeIn("slow");
- });
复制代码
属性过滤方法
[attribute]选取拥有指定属性的元素。
- // 选取所有拥有href属性的<a>元素
- $("a[href]")
- // 实际应用示例
- $("input[id]").css("border", "1px solid blue");
复制代码
[attribute=value]选取指定属性等于特定值的元素。
- // 选取所有type属性为"checkbox"的<input>元素
- $("input[type='checkbox']")
- // 实际应用示例
- $("input[type='text']").addClass("text-input");
复制代码
[attribute!=value]选取指定属性不等于特定值的元素。
- // 选取所有href属性不等于"#"的<a>元素
- $("a[href!='#']")
- // 实际应用示例
- $("input[name!='username']").css("background-color", "#f9f9f9");
复制代码
[attribute^=value]选取指定属性以特定值开始的元素。
- // 选取所有href属性以"https://"开始的<a>元素
- $("a[href^='https://']")
- // 实际应用示例
- $("img[src^='images/']").css("border", "2px solid green");
复制代码
[attribute$=value]选取指定属性以特定值结束的元素。
- // 选取所有src属性以".jpg"结束的<img>元素
- $("img[src$='.jpg']")
- // 实际应用示例
- $("a[href$='.pdf']").after("<span>(PDF)</span>");
复制代码
[attribute*=value]选取指定属性包含特定值的元素。
- // 选取所有name属性包含"user"的<input>元素
- $("input[name*='user']")
- // 实际应用示例
- $("div[class*='container']").css("margin", "10px");
复制代码
子元素过滤方法
:nth-child选取父元素下的第N个子元素或奇偶元素。
- // 选取每个<ul>父元素下的第2个<li>子元素
- $("ul li:nth-child(2)")
- // 选取每个父元素下的偶数子元素
- $("li:nth-child(even)")
- // 实际应用示例
- $("tr:nth-child(3n)").css("background-color", "#f0f0f0"); // 每3行设置一次背景色
复制代码
:first-child选取父元素的第一个子元素,:last-child选取父元素的最后一个子元素。
- // 选取每个<ul>父元素的第一个<li>子元素
- $("ul li:first-child")
- // 选取每个<ul>父元素的最后一个<li>子元素
- $("ul li:last-child")
- // 实际应用示例
- $("p:first-child").css("font-weight", "bold");
- $("p:last-child").css("margin-bottom", "0");
复制代码
:only-child选取父元素的唯一子元素。
- // 选取作为父元素唯一子元素的<p>元素
- $("p:only-child")
- // 实际应用示例
- $("div:only-child").css("width", "100%");
复制代码
表单过滤方法
这些选择器用于选取不同类型的表单元素。
- // 选取所有的<input>、<textarea>、<select>和<button>元素
- $(":input")
- // 选取所有的文本框
- $(":text")
- // 选取所有的密码框
- $(":password")
- // 选取所有的单选按钮
- $(":radio")
- // 选取所有的复选框
- $(":checkbox")
- // 选取所有的提交按钮
- $(":submit")
- // 选取所有的图像按钮
- $(":image")
- // 选取所有的重置按钮
- $(":reset")
- // 选取所有的按钮
- $(":button")
- // 选取所有的文件上传域
- $(":file")
- // 实际应用示例
- $(":text").addClass("text-field");
- $(":password").addClass("password-field");
- $(":submit").addClass("submit-button");
复制代码
这些选择器用于选取表单元素的不同状态。
- // 选取所有可用的表单元素
- $(":enabled")
- // 选取所有禁用的表单元素
- $(":disabled")
- // 选取所有被选中的复选框或单选按钮
- $(":checked")
- // 选取所有被选中的<option>元素
- $(":selected")
- // 实际应用示例
- $(":disabled").css("opacity", "0.5");
- $(":checked").parent().css("background-color", "#ffffcc");
- $(":selected").each(function() {
- alert("已选择: " + $(this).text());
- });
复制代码
jQuery元素操作技巧
DOM操作
jQuery提供了简单的方法来创建新元素。
- // 创建一个新的<div>元素
- var newDiv = $("<div></div>");
- // 创建带有内容和属性的<div>元素
- var newDivWithContent = $("<div>", {
- "class": "myClass",
- "id": "myId",
- "text": "这是一个新div",
- "click": function() {
- alert("点击了新div");
- }
- });
- // 实际应用示例
- var newItem = $("<li>", {
- "text": "新列表项",
- "class": "item",
- "click": function() {
- $(this).toggleClass("active");
- }
- });
- $("#myList").append(newItem);
复制代码
jQuery提供了多种方法来插入元素。
- // 在元素内部末尾插入内容
- $("#container").append("<p>新段落</p>");
- $("<p>新段落</p>").appendTo("#container");
- // 在元素内部开头插入内容
- $("#container").prepend("<p>新段落</p>");
- $("<p>新段落</p>").prependTo("#container");
- // 在元素之后插入内容
- $("#container").after("<div>新div</div>");
- $("<div>新div</div>").insertAfter("#container");
- // 在元素之前插入内容
- $("#container").before("<div>新div</div>");
- $("<div>新div</div>").insertBefore("#container");
- // 实际应用示例 - 动态添加列表项
- $("#addItem").click(function() {
- var itemText = $("#itemInput").val();
- if (itemText) {
- var newItem = $("<li>", {
- "text": itemText,
- "class": "list-item"
- });
- $("#itemList").append(newItem);
- $("#itemInput").val("");
- }
- });
复制代码
jQuery允许你替换已存在的元素。
- // 替换元素
- $("p.oldParagraph").replaceWith("<div>新div</div>");
- $("<div>新div</div>").replaceAll("p.oldParagraph");
- // 实际应用示例
- $(".old-button").replaceWith("<button class='new-button'>新按钮</button>");
复制代码
jQuery提供了多种方法来删除元素。
- // 删除元素及其子元素
- $("#myDiv").remove();
- // 删除元素的子元素,但保留元素本身
- $("#myDiv").empty();
- // 删除匹配元素集合中不符合指定选择器的元素
- $("p").not(".keep").remove();
- // 实际应用示例
- $("#removeButton").click(function() {
- $("#itemList li.selected").remove();
- });
复制代码
jQuery允许你克隆元素。
- // 克隆元素
- var clonedElement = $("#myDiv").clone();
- // 克隆元素及其事件
- var clonedElementWithEvents = $("#myDiv").clone(true);
- // 实际应用示例
- $("#cloneButton").click(function() {
- var clonedItem = $("#templateItem").clone(true);
- clonedItem.removeAttr("id").show();
- $("#itemList").append(clonedItem);
- });
复制代码
CSS操作
jQuery提供了简单的方法来获取和设置CSS属性。
- // 获取CSS属性值
- var color = $("#myDiv").css("color");
- // 设置单个CSS属性
- $("#myDiv").css("color", "red");
- // 设置多个CSS属性
- $("#myDiv").css({
- "color": "red",
- "background-color": "yellow",
- "font-size": "14px"
- });
- // 实际应用示例
- $("#styleButton").click(function() {
- $("#targetDiv").css({
- "background-color": "#f0f0f0",
- "border": "1px solid #ccc",
- "padding": "10px",
- "border-radius": "5px"
- });
- });
复制代码
jQuery提供了简单的方法来操作元素的类。
- // 添加类
- $("#myDiv").addClass("highlight");
- // 添加多个类
- $("#myDiv").addClass("highlight important");
- // 移除类
- $("#myDiv").removeClass("highlight");
- // 移除多个类
- $("#myDiv").removeClass("highlight important");
- // 切换类
- $("#myDiv").toggleClass("highlight");
- // 实际应用示例
- $("#toggleButton").click(function() {
- $("#targetDiv").toggleClass("highlight");
- $(this).text(function(i, text) {
- return text === "高亮显示" ? "取消高亮" : "高亮显示";
- });
- });
复制代码
jQuery提供了获取和设置元素尺寸的方法。
- // 获取宽度
- var width = $("#myDiv").width();
- // 设置宽度
- $("#myDiv").width(200);
- // 获取高度
- var height = $("#myDiv").height();
- // 设置高度
- $("#myDiv").height(100);
- // 获取内部宽度(包括padding,不包括border)
- var innerWidth = $("#myDiv").innerWidth();
- // 获取内部高度(包括padding,不包括border)
- var innerHeight = $("#myDiv").innerHeight();
- // 获取外部宽度(包括padding和border)
- var outerWidth = $("#myDiv").outerWidth();
- // 获取外部高度(包括padding和border)
- var outerHeight = $("#myDiv").outerHeight();
- // 获取外部宽度(包括padding、border和margin)
- var outerWidthMargin = $("#myDiv").outerWidth(true);
- // 获取外部高度(包括padding、border和margin)
- var outerHeightMargin = $("#myDiv").outerHeight(true);
- // 实际应用示例
- $("#resizeButton").click(function() {
- var currentWidth = $("#targetDiv").width();
- var currentHeight = $("#targetDiv").height();
-
- $("#targetDiv").width(currentWidth + 50);
- $("#targetDiv").height(currentHeight + 30);
-
- $("#sizeInfo").text("新尺寸: " + $("#targetDiv").width() + "x" + $("#targetDiv").height());
- });
复制代码
属性操作
jQuery提供了简单的方法来获取和设置元素属性。
- // 获取属性值
- var id = $("#myDiv").attr("id");
- // 设置属性
- $("#myDiv").attr("title", "这是一个div");
- // 设置多个属性
- $("#myDiv").attr({
- "title": "这是一个div",
- "data-info": "重要信息"
- });
- // 移除属性
- $("#myDiv").removeAttr("title");
- // 实际应用示例
- $("#imageGallery img").each(function() {
- var altText = $(this).attr("alt") || "图片";
- $(this).attr("title", altText);
- });
复制代码
jQuery提供了data()方法来存储和获取与元素相关的数据。
- // 存储数据
- $("#myDiv").data("key", "value");
- // 获取数据
- var value = $("#myDiv").data("key");
- // 存储多个数据
- $("#myDiv").data({
- "name": "John",
- "age": 30,
- "city": "New York"
- });
- // 获取多个数据
- var data = $("#myDiv").data();
- // 实际应用示例
- $(".product-item").click(function() {
- var productId = $(this).data("id");
- var productName = $(this).data("name");
- var productPrice = $(this).data("price");
-
- $("#selectedProduct").text("已选择: " + productName + " - $" + productPrice);
- $("#productId").val(productId);
- });
复制代码
jQuery提供了val()方法来获取和设置表单元素的值。
- // 获取表单元素的值
- var inputValue = $("#myInput").val();
- // 设置表单元素的值
- $("#myInput").val("新值");
- // 获取下拉框的选中值
- var selectValue = $("#mySelect").val();
- // 设置下拉框的选中值
- $("#mySelect").val("option2");
- // 获取复选框的选中状态
- var isChecked = $("#myCheckbox").prop("checked");
- // 设置复选框的选中状态
- $("#myCheckbox").prop("checked", true);
- // 获取多个选中的复选框的值
- var checkedValues = $("input[name='checkboxGroup']:checked").map(function() {
- return $(this).val();
- }).get();
- // 实际应用示例
- $("#submitForm").click(function() {
- var formData = {
- username: $("#username").val(),
- email: $("#email").val(),
- interests: $("input[name='interests']:checked").map(function() {
- return $(this).val();
- }).get()
- };
-
- console.log(formData);
- // 这里可以添加AJAX提交表单的代码
- });
复制代码
性能优化建议
缓存jQuery对象
重复使用同一个jQuery选择器会影响性能,最好将jQuery对象缓存起来。
- // 不好的做法
- $("#myDiv").css("color", "red");
- $("#myDiv").addClass("highlight");
- $("#myDiv").fadeIn();
- // 好的做法
- var $myDiv = $("#myDiv");
- $myDiv.css("color", "red");
- $myDiv.addClass("highlight");
- $myDiv.fadeIn();
复制代码
使用链式操作
jQuery支持链式操作,可以减少代码量并提高性能。
- // 不好的做法
- $("#myDiv").css("color", "red");
- $("#myDiv").addClass("highlight");
- $("#myDiv").fadeIn();
- // 好的做法
- $("#myDiv").css("color", "red").addClass("highlight").fadeIn();
复制代码
使用更具体的选择器
更具体的选择器可以提高性能,因为jQuery需要遍历的元素更少。
- // 不好的做法
- $(".myClass");
- // 好的做法
- $("div.myClass"); // 更具体,只查找div元素
- $("#container .myClass"); // 在指定容器内查找
复制代码
避免过度使用通用选择器
通用选择器*会匹配所有元素,性能较差,应尽量避免使用。
- // 不好的做法
- $("#container *").hide();
- // 好的做法
- $("#container").children().hide();
复制代码
使用原生JavaScript方法
对于简单的操作,使用原生JavaScript方法可能更快。
- // 不好的做法
- $("#myDiv").attr("id");
- // 好的做法
- document.getElementById("myDiv").id;
- // 不好的做法
- $("#myDiv").css("display", "none");
- // 好的做法
- document.getElementById("myDiv").style.display = "none";
复制代码
使用事件委托
对于动态添加的元素,使用事件委托比直接绑定事件更高效。
- // 不好的做法 - 直接绑定
- $(".item").click(function() {
- $(this).toggleClass("active");
- });
- // 好的做法 - 事件委托
- $("#itemList").on("click", ".item", function() {
- $(this).toggleClass("active");
- });
复制代码
实际应用案例
动态表格操作
下面是一个完整的动态表格操作示例,包括添加、删除、编辑和排序功能。
- <!DOCTYPE html>
- <html lang="zh-CN">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>动态表格操作示例</title>
- <style>
- body {
- font-family: Arial, sans-serif;
- margin: 20px;
- }
- table {
- border-collapse: collapse;
- width: 100%;
- }
- th, td {
- border: 1px solid #ddd;
- padding: 8px;
- text-align: left;
- }
- th {
- background-color: #f2f2f2;
- cursor: pointer;
- }
- tr:nth-child(even) {
- background-color: #f9f9f9;
- }
- tr:hover {
- background-color: #f1f1f1;
- }
- .form-group {
- margin-bottom: 10px;
- }
- .form-group label {
- display: inline-block;
- width: 100px;
- }
- .form-group input {
- padding: 5px;
- width: 200px;
- }
- button {
- padding: 6px 12px;
- margin-right: 5px;
- cursor: pointer;
- }
- .edit-mode input {
- border: 1px solid #4CAF50;
- background-color: #f9f9f9;
- }
- .notification {
- padding: 10px;
- margin: 10px 0;
- border-radius: 4px;
- display: none;
- }
- .success {
- background-color: #dff0d8;
- color: #3c763d;
- }
- .error {
- background-color: #f2dede;
- color: #a94442;
- }
- </style>
- </head>
- <body>
- <h1>动态表格操作示例</h1>
-
- <div id="notification" class="notification"></div>
-
- <div class="form-group">
- <label for="name">姓名:</label>
- <input type="text" id="name" placeholder="输入姓名">
- </div>
-
- <div class="form-group">
- <label for="age">年龄:</label>
- <input type="number" id="age" placeholder="输入年龄">
- </div>
-
- <div class="form-group">
- <label for="email">邮箱:</label>
- <input type="email" id="email" placeholder="输入邮箱">
- </div>
-
- <button id="addRow">添加行</button>
- <button id="clearForm">清空表单</button>
-
- <h2>用户数据表</h2>
- <table id="dataTable">
- <thead>
- <tr>
- <th data-sort="name">姓名 ↕</th>
- <th data-sort="age">年龄 ↕</th>
- <th data-sort="email">邮箱 ↕</th>
- <th>操作</th>
- </tr>
- </thead>
- <tbody>
- <tr>
- <td>张三</td>
- <td>25</td>
- <td>zhangsan@example.com</td>
- <td>
- <button class="edit-btn">编辑</button>
- <button class="delete-btn">删除</button>
- </td>
- </tr>
- <tr>
- <td>李四</td>
- <td>30</td>
- <td>lisi@example.com</td>
- <td>
- <button class="edit-btn">编辑</button>
- <button class="delete-btn">删除</button>
- </td>
- </tr>
- <tr>
- <td>王五</td>
- <td>28</td>
- <td>wangwu@example.com</td>
- <td>
- <button class="edit-btn">编辑</button>
- <button class="delete-btn">删除</button>
- </td>
- </tr>
- </tbody>
- </table>
- <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
- <script>
- $(document).ready(function() {
- // 显示通知
- function showNotification(message, type) {
- var $notification = $("#notification");
- $notification.removeClass("success error").addClass(type);
- $notification.text(message);
- $notification.fadeIn();
-
- setTimeout(function() {
- $notification.fadeOut();
- }, 3000);
- }
-
- // 添加行
- $("#addRow").click(function() {
- var name = $("#name").val().trim();
- var age = $("#age").val().trim();
- var email = $("#email").val().trim();
-
- if (!name || !age || !email) {
- showNotification("请填写所有字段", "error");
- return;
- }
-
- var $newRow = $("<tr>");
- $newRow.append("<td>" + name + "</td>");
- $newRow.append("<td>" + age + "</td>");
- $newRow.append("<td>" + email + "</td>");
-
- var $actions = $("<td>");
- $actions.append("<button class='edit-btn'>编辑</button>");
- $actions.append("<button class='delete-btn'>删除</button>");
- $newRow.append($actions);
-
- $("#dataTable tbody").append($newRow);
- clearForm();
- showNotification("行添加成功", "success");
- });
-
- // 清空表单
- $("#clearForm").click(function() {
- clearForm();
- });
-
- function clearForm() {
- $("#name").val("");
- $("#age").val("");
- $("#email").val("");
- }
-
- // 删除行 - 使用事件委托
- $("#dataTable tbody").on("click", ".delete-btn", function() {
- if (confirm("确定要删除这一行吗?")) {
- $(this).closest("tr").remove();
- showNotification("行删除成功", "success");
- }
- });
-
- // 编辑行 - 使用事件委托
- $("#dataTable tbody").on("click", ".edit-btn", function() {
- var $row = $(this).closest("tr");
- var $cells = $row.find("td:not(:last-child)");
-
- if ($row.hasClass("edit-mode")) {
- // 保存编辑
- $cells.each(function() {
- var value = $(this).find("input").val();
- $(this).text(value);
- });
- $row.removeClass("edit-mode");
- $(this).text("编辑");
- showNotification("行更新成功", "success");
- } else {
- // 进入编辑模式
- $cells.each(function() {
- var text = $(this).text();
- $(this).html("<input type='text' value='" + text + "'>");
- });
- $row.addClass("edit-mode");
- $(this).text("保存");
- }
- });
-
- // 排序功能
- var sortOrder = {};
-
- $("th[data-sort]").click(function() {
- var column = $(this).data("sort");
- var $tbody = $("#dataTable tbody");
- var $rows = $tbody.find("tr").get();
-
- // 切换排序顺序
- sortOrder[column] = sortOrder[column] === "asc" ? "desc" : "asc";
-
- // 排序行
- $rows.sort(function(a, b) {
- var aValue = $(a).children("td").eq($(this).index()).text();
- var bValue = $(b).children("td").eq($(this).index()).text();
-
- // 数字比较
- if (!isNaN(aValue) && !isNaN(bValue)) {
- aValue = parseFloat(aValue);
- bValue = parseFloat(bValue);
- }
-
- if (sortOrder[column] === "asc") {
- return aValue > bValue ? 1 : -1;
- } else {
- return aValue < bValue ? 1 : -1;
- }
- }.bind(this));
-
- // 重新排列行
- $.each($rows, function(index, row) {
- $tbody.append(row);
- });
-
- // 更新排序指示器
- $("th[data-sort]").each(function() {
- if ($(this).data("sort") === column) {
- $(this).text($(this).text().replace(/ ↕| ↑| ↓/, "") +
- (sortOrder[column] === "asc" ? " ↑" : " ↓"));
- } else {
- $(this).text($(this).text().replace(/ ↕| ↑| ↓/, "") + " ↕");
- }
- });
- });
- });
- </script>
- </body>
- </html>
复制代码
这个示例展示了如何使用jQuery实现以下功能:
1. 添加新行到表格
2. 删除表格中的行
3. 编辑表格中的行数据
4. 按列对表格进行排序
5. 表单验证和用户通知
6. 事件委托处理动态添加的元素
图片懒加载
下面是一个图片懒加载的示例,当用户滚动到图片位置时才加载图片,提高页面加载性能。
- <!DOCTYPE html>
- <html lang="zh-CN">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>图片懒加载示例</title>
- <style>
- body {
- font-family: Arial, sans-serif;
- margin: 0;
- padding: 20px;
- }
- .container {
- max-width: 1200px;
- margin: 0 auto;
- }
- .image-gallery {
- display: grid;
- grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
- gap: 20px;
- }
- .image-item {
- border: 1px solid #ddd;
- border-radius: 4px;
- overflow: hidden;
- box-shadow: 0 2px 4px rgba(0,0,0,0.1);
- }
- .image-item img {
- width: 100%;
- height: 200px;
- object-fit: cover;
- display: block;
- background-color: #f9f9f9;
- }
- .image-item .caption {
- padding: 10px;
- text-align: center;
- }
- .loading {
- text-align: center;
- padding: 20px;
- font-style: italic;
- color: #666;
- }
- .notification {
- position: fixed;
- bottom: 20px;
- right: 20px;
- padding: 15px;
- background-color: #4CAF50;
- color: white;
- border-radius: 4px;
- box-shadow: 0 2px 10px rgba(0,0,0,0.2);
- display: none;
- z-index: 1000;
- }
- </style>
- </head>
- <body>
- <div class="container">
- <h1>图片懒加载示例</h1>
- <p>向下滚动页面,当图片进入视口时才会加载。</p>
-
- <div class="image-gallery">
- <!-- 图片将通过JavaScript动态添加 -->
- </div>
-
- <div class="loading" id="loading">加载中...</div>
- </div>
-
- <div class="notification" id="notification"></div>
- <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
- <script>
- $(document).ready(function() {
- // 显示通知
- function showNotification(message) {
- var $notification = $("#notification");
- $notification.text(message);
- $notification.fadeIn();
-
- setTimeout(function() {
- $notification.fadeOut();
- }, 2000);
- }
-
- // 创建图片项
- function createImageItem(index) {
- var $item = $("<div class='image-item'>");
- var $img = $("<img>", {
- "data-src": "https://picsum.photos/seed/img" + index + "/400/300.jpg",
- "alt": "图片 " + index,
- "class": "lazy-load"
- });
- var $caption = $("<div class='caption'>图片 " + index + "</div>");
-
- $item.append($img);
- $item.append($caption);
-
- return $item;
- }
-
- // 检查元素是否在视口中
- function isElementInViewport(el) {
- var rect = el.getBoundingClientRect();
- return (
- rect.top >= 0 &&
- rect.left >= 0 &&
- rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
- rect.right <= (window.innerWidth || document.documentElement.clientWidth)
- );
- }
-
- // 加载图片
- function loadImages() {
- var $images = $(".lazy-load:not(.loaded)");
- var loadedCount = 0;
-
- $images.each(function() {
- if (isElementInViewport(this)) {
- var $img = $(this);
- $img.attr("src", $img.data("src"));
- $img.addClass("loaded");
- loadedCount++;
- }
- });
-
- if (loadedCount > 0) {
- showNotification("已加载 " + loadedCount + " 张图片");
- }
- }
-
- // 初始化图片画廊
- function initGallery() {
- var $gallery = $(".image-gallery");
-
- // 添加初始图片
- for (var i = 1; i <= 12; i++) {
- $gallery.append(createImageItem(i));
- }
-
- // 初始加载可见图片
- loadImages();
-
- // 滚动时加载图片
- $(window).on("scroll", function() {
- loadImages();
- });
-
- // 模拟加载更多图片
- var loading = false;
- $(window).on("scroll", function() {
- if ($(window).scrollTop() + $(window).height() > $(document).height() - 100 && !loading) {
- loading = true;
- $("#loading").show();
-
- // 模拟网络延迟
- setTimeout(function() {
- var currentIndex = $(".image-item").length;
- for (var i = currentIndex + 1; i <= currentIndex + 6; i++) {
- $gallery.append(createImageItem(i));
- }
-
- loadImages();
- $("#loading").hide();
- loading = false;
- }, 1000);
- }
- });
- }
-
- // 初始化
- initGallery();
- });
- </script>
- </body>
- </html>
复制代码
这个示例展示了如何使用jQuery实现图片懒加载功能:
1. 创建图片项并设置data-src属性而不是直接设置src
2. 检测元素是否进入视口
3. 当图片进入视口时,将data-src的值赋给src属性,开始加载图片
4. 滚动时持续检查并加载进入视口的图片
5. 实现无限滚动加载更多图片的功能
总结
jQuery元素查询和操作是前端开发的基础技能,掌握这些技巧可以显著提高开发效率。本文从基础选择器到高级过滤方法,全面解析了jQuery元素查找和操作的各种技巧,并通过实际案例展示了这些技巧的应用。
通过学习本文,你应该能够:
1. 熟练使用jQuery的各种选择器,包括基本选择器、层次选择器和各种过滤选择器
2. 掌握jQuery的DOM操作、CSS操作和属性操作方法
3. 了解jQuery性能优化的最佳实践
4. 能够将所学知识应用到实际项目中,解决复杂的交互问题
jQuery虽然已经不再是前端开发的首选库(现在更流行React、Vue等框架),但它的设计思想和API设计仍然值得学习。许多现代框架的设计理念也受到了jQuery的影响。掌握jQuery元素查询技巧,不仅能提高你处理遗留jQuery代码的能力,还能帮助你更好地理解前端开发的基本原理。
希望本文能帮助你成为前端开发高手,在实际项目中更加高效地使用jQuery进行元素查询和操作!
版权声明
1、转载或引用本网站内容(掌握jQuery元素查询技巧提升网页开发效率从基础选择器到高级过滤方法全面解析jQuery元素查找和操作让你成为前端高手)须注明原网址及作者(威震华夏关云长),并标明本网站网址(https://pixtech.cc/)。
2、对于不当转载或引用本网站内容而引起的民事纷争、行政处理或其他损失,本网站不承担责任。
3、对不遵守本声明或其他违法、恶意使用本网站内容者,本网站保留追究其法律责任的权利。
本文地址: https://pixtech.cc/thread-41634-1-1.html
|
|