零基础学习jQuery第四天

目录

一、DOM 操作进阶:动态创建与修改元素

1. 动态创建复杂元素(高效写法)

2. 元素属性与样式的批量操作

二、事件处理深化:委托与高级绑定

1. 事件委托(解决动态元素事件绑定问题)

2. 事件命名空间(方便管理和移除事件)

3. 阻止事件冒泡与默认行为

三、综合案例:动态 Todo 列表

今日总结


今天我们来学习 jQuery 中非常实用的 DOM 操作进阶 和 事件处理深化,这两部分是日常开发中高频使用的内容,能帮你更灵活地操控页面元素和响应用户交互。

一、DOM 操作进阶:动态创建与修改元素

除了之前学的查找、添加 / 删除元素,今天我们重点掌握 动态生成复杂元素 和 批量操作 DOM 的技巧,这在渲染列表、动态表单等场景中非常有用。

1. 动态创建复杂元素(高效写法)

直接拼接 HTML 字符串是创建元素的常用方式,但注意避免频繁拼接(影响性能),可以先构建完整字符串再插入。

案例:动态生成商品列表

html

预览

<div id="productList"></div>

<script>
// 模拟后端返回的商品数据
const products = [
  { id: 1, name: "笔记本电脑", price: 5999 },
  { id: 2, name: "机械键盘", price: 299 },
  { id: 3, name: "无线鼠标", price: 129 }
];

// 构建 HTML 字符串(批量生成)
let html = '<ul class="product-ul">';
products.forEach(product => {
  // 拼接单个商品的 HTML
  html += `
    <li data-id="${product.id}" class="product-item">
      <h3>${product.name}</h3>
      <p>价格:${product.price}元</p>
      <button class="add-cart">加入购物车</button>
    </li>
  `;
});
html += '</ul>';

// 一次性插入到页面(比多次 append 高效)
$("#productList").html(html);
</script>
2. 元素属性与样式的批量操作
  • 属性操作:使用 attr() 批量设置属性,data() 操作自定义数据(data-* 属性)。
  • 样式操作:使用 css() 批量设置样式,结合 addClass()/removeClass() 控制类。

javascript

// 批量设置属性
$(".product-item:first").attr({
  "title": "热卖商品",
  "data-type": "electronics"
});

// 读取自定义数据(对应 data-id、data-type)
const firstId = $(".product-item:first").data("id"); // 1
const firstType = $(".product-item:first").data("type"); // "electronics"

// 批量设置样式
$(".add-cart").css({
  "background-color": "#007bff",
  "color": "white",
  "padding": "5px 10px",
  "border": "none",
  "cursor": "pointer"
});

// 点击按钮时切换样式类
$(".add-cart").click(function() {
  $(this).toggleClass("active"); // 切换 active 类(可在 CSS 中定义活跃状态)
});

二、事件处理深化:委托与高级绑定

之前学了 click() 等简单事件,但面对 动态生成的元素 或 需要统一管理的事件,需要掌握事件委托和命名空间。

1. 事件委托(解决动态元素事件绑定问题)

动态生成的元素(如上面案例中的商品按钮)直接用 click() 绑定事件会失效,因为元素创建时事件还未绑定。此时需要用 事件委托:将事件绑定到父元素,由父元素代理触发。

案例:给动态生成的 “加入购物车” 按钮绑定点击事件

javascript

// 事件委托:将事件绑定到父元素 #productList
$("#productList").on("click", ".add-cart", function() {
  // $(this) 指向被点击的 .add-cart 按钮
  const productItem = $(this).closest(".product-item"); // 找到父级商品元素
  const productId = productItem.data("id");
  const productName = productItem.find("h3").text();
  
  alert(`已将【${productName}】加入购物车,ID:${productId}`);
});
  • 原理:事件冒泡到父元素,父元素根据选择器(.add-cart)判断是否触发事件。
  • 优势:无需为每个动态元素单独绑定,性能更优。
2. 事件命名空间(方便管理和移除事件)

当一个元素绑定多个同类型事件(如多个 click),可以用命名空间区分,便于单独移除。

javascript

// 绑定带命名空间的事件
$(".add-cart").on("click.add", function() {
  console.log("添加到购物车");
});

$(".add-cart").on("click.log", function() {
  console.log("记录操作日志");
});

// 只移除 "add" 命名空间的 click 事件
$(".add-cart").off("click.add");
// 移除所有 click 事件(不带命名空间)
// $(".add-cart").off("click");
3. 阻止事件冒泡与默认行为
  • event.stopPropagation():阻止事件冒泡(父元素不会再触发该事件)。
  • event.preventDefault():阻止元素默认行为(如链接跳转、表单提交)。
  • 简写:return false(同时阻止冒泡和默认行为,仅限 jQuery 事件处理中)。

javascript

// 阻止链接跳转(默认行为)
$("a.prevent").click(function(event) {
  event.preventDefault(); // 等价于 return false;
  console.log("链接被点击,但不跳转");
});

// 阻止事件冒泡
$(".child").click(function(event) {
  event.stopPropagation(); // 父元素的 click 事件不会触发
  console.log("子元素被点击");
});

$(".parent").click(function() {
  console.log("父元素被点击"); // 若子元素触发,且未阻止冒泡,这里会执行
});

三、综合案例:动态 Todo 列表

结合今天的知识,实现一个可添加、删除、标记完成的 Todo 列表。

html

预览

<div class="todo-app">
  <input type="text" id="todoInput" placeholder="输入待办事项...">
  <button id="addTodo">添加</button>
  <ul id="todoList"></ul>
</div>

<style>
  .todo-item { padding: 8px; margin: 5px 0; border: 1px solid #eee; }
  .todo-item.done { text-decoration: line-through; color: #999; }
  .delete { margin-left: 10px; color: red; cursor: pointer; }
</style>

<script>
// 初始化待办列表
let todos = [
  { id: 1, content: "学习 jQuery", done: false }
];

// 渲染列表
function renderTodos() {
  let html = "";
  todos.forEach(todo => {
    html += `
      <li class="todo-item ${todo.done ? 'done' : ''}" data-id="${todo.id}">
        <span class="content">${todo.content}</span>
        <span class="delete">删除</span>
      </li>
    `;
  });
  $("#todoList").html(html);
}

// 初始渲染
renderTodos();

// 添加待办
$("#addTodo").click(function() {
  const content = $("#todoInput").val().trim();
  if (!content) return;
  
  // 添加新待办
  todos.push({
    id: Date.now(), // 用时间戳作为唯一 ID
    content: content,
    done: false
  });
  
  // 重新渲染
  renderTodos();
  // 清空输入框
  $("#todoInput").val("");
});

// 事件委托:标记完成/未完成(点击内容)
$("#todoList").on("click", ".content", function() {
  const id = $(this).parent().data("id");
  // 找到对应 todo 并切换 done 状态
  todos = todos.map(todo => 
    todo.id === id ? { ...todo, done: !todo.done } : todo
  );
  renderTodos();
});

// 事件委托:删除待办(点击删除按钮)
$("#todoList").on("click", ".delete", function(event) {
  event.stopPropagation(); // 阻止冒泡(避免触发上面的 .content 点击事件)
  const id = $(this).parent().data("id");
  todos = todos.filter(todo => todo.id !== id); // 过滤掉要删除的项
  renderTodos();
});
</script>

今日总结

  1. DOM 操作:通过拼接 HTML 字符串高效创建动态元素,用 attr()data()css() 批量操作属性和样式。
  2. 事件处理
    • 事件委托(on() 的事件委托写法)解决动态元素绑定问题。
    • 事件命名空间方便管理多个同类型事件。
    • 阻止冒泡(stopPropagation())和默认行为(preventDefault())。
  3. 综合案例中,我们结合了动态渲染、事件委托和数据操作,模拟了真实项目中的常见场景。

明天我们会学习 jQuery 的动画效果和插件使用,让页面交互更生动~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值