JavaScript实现页面全选功能详解

一、基础场景与实现原理

典型应用场景

  • 表格批量操作

  • 购物车商品全选

  • 邮件列表管理

  • 批量文件操作

核心实现逻辑

  1. 全选框与子选框的关联绑定

  2. 双向状态同步机制

  3. 动态数据更新处理

二、HTML基础结构

<!-- 全选控制器 -->
<div class="select-control">
  <input type="checkbox" id="selectAll"> 全选/取消
</div>

<!-- 数据列表 -->
<ul class="item-list">
  <li><input type="checkbox" class="itemCheckbox"> 选项1</li>
  <li><input type="checkbox" class="itemCheckbox"> 选项2</li>
  <li><input type="checkbox" class="itemCheckbox"> 选项3</li>
</ul>

三、JavaScript核心实现

1. 元素获取

const selectAll = document.getElementById('selectAll');
const checkboxes = document.querySelectorAll('.itemCheckbox');

2. 全选功能实现

// 全选框点击事件
selectAll.addEventListener('click', function() {
  const isChecked = this.checked;
  checkboxes.forEach(checkbox => {
    checkbox.checked = isChecked;
  });
});

// 子选框点击事件
checkboxes.forEach(checkbox => {
  checkbox.addEventListener('click', function() {
    // 检测是否全部选中
    const allChecked = [...checkboxes].every(c => c.checked);
    // 检测是否有选中项
    const anyChecked = [...checkboxes].some(c => c.checked);
    
    selectAll.checked = allChecked;
    selectAll.indeterminate = !allChecked && anyChecked;
  });
});

四、增强功能实现

1. 中间态显示

// 设置indeterminate属性显示半选状态
selectAll.indeterminate = !allChecked && anyChecked;

2. 动态数据支持

// 监听DOM变化
const observer = new MutationObserver(mutations => {
  checkboxes = document.querySelectorAll('.itemCheckbox');
});

observer.observe(document.body, { childList: true, subtree: true });

3. 性能优化

// 使用事件委托
document.querySelector('.item-list').addEventListener('click', e => {
  if(e.target.classList.contains('itemCheckbox')) {
    // 处理逻辑
  }
});

五、完整示例代码

<!DOCTYPE html>
<html>
<head>
  <style>
    .indeterminate { background: #ddd; }
  </style>
</head>
<body>
  <div class="control">
    <input type="checkbox" id="selectAll"> 全选
    <span id="count">已选0项</span>
  </div>

  <div class="list">
    <div><input type="checkbox" class="item"> 选项A</div>
    <div><input type="checkbox" class="item"> 选项B</div>
    <div><input type="checkbox" class="item"> 选项C</div>
  </div>

  <script>
    const selectAll = document.getElementById('selectAll');
    let items = document.querySelectorAll('.item');

    // 全选控制
    selectAll.addEventListener('change', function() {
      items.forEach(item => item.checked = this.checked);
      updateCount();
    });

    // 子项控制
    document.querySelector('.list').addEventListener('change', e => {
      if(!e.target.classList.contains('item')) return;
      
      const allChecked = [...items].every(i => i.checked);
      const anyChecked = [...items].some(i => i.checked);
      
      selectAll.checked = allChecked;
      selectAll.indeterminate = !allChecked && anyChecked;
      updateCount();
    });

    // 更新计数器
    function updateCount() {
      const count = [...items].filter(i => i.checked).length;
      document.getElementById('count').textContent = `已选${count}项`;
    }
  </script>
</body>
</html>

通过本文的实现方案,可以构建出健壮的全选功能系统。核心要点在于保持状态同步的准确性和处理动态内容的灵活性,开发者可根据具体业务需求进行功能扩展和优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值