问了国产几大AI一个关于HTML问题:怎么让一排复选框支持按shift批量选中起点到终点的选框?

经过测试,KIMI、deepseek、豆包、通义千问给的答案都很好,而且都支持多个区间选择和取消选择,该有考虑到的都有考虑,也还不错,百度文心一言本次答案不及格,代码根本没法用。更搞笑的是,代码加密,根本不给你源代码😅 也是让人服气了。

问了AI一个HTML问题:怎么让一排复选框支持按shift批量选中起点到终点的选框?

下面贴上各家给的代码吧:

KIMI给的代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Shift 批量选中复选框</title>
    <style>
        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            max-width: 600px;
            margin: 50px auto;
            padding: 20px;
            background-color: #f8f9fa;
        }
        .checkbox-container {
            background: white;
            border-radius: 8px;
            padding: 20px;
            box-shadow: 0 2px 10px rgba(0,0,0,0.1);
        }
        .checkbox-item {
            display: flex;
            align-items: center;
            padding: 10px;
            margin: 5px 0;
            border-radius: 4px;
            transition: background-color 0.2s;
        }
        .checkbox-item:hover {
            background-color: #f0f0f0;
        }
        .checkbox-item input[type="checkbox"] {
            width: 18px;
            height: 18px;
            margin-right: 10px;
            cursor: pointer;
        }
        .checkbox-item label {
            cursor: pointer;
            font-size: 16px;
        }
        h2 {
            color: #333;
            text-align: center;
            margin-bottom: 20px;
        }
        .instructions {
            background-color: #e3f2fd;
            padding: 15px;
            border-radius: 4px;
            margin-bottom: 20px;
            font-size: 14px;
            color: #1976d2;
        }
    </style>
</head>
<body>
    <div class="checkbox-container">
        <h2>复选框 Shift 批量选中示例</h2>
        <div class="instructions">
            💡 使用说明:先点击一个复选框,然后按住 Shift 键点击另一个复选框,即可选中两者之间的所有复选框。
        </div>
        
        <div class="checkbox-item">
            <input type="checkbox" id="item1" class="checkbox">
            <label for="item1">选项 1 - 苹果</label>
        </div>
        <div class="checkbox-item">
            <input type="checkbox" id="item2" class="checkbox">
            <label for="item2">选项 2 - 香蕉</label>
        </div>
        <div class="checkbox-item">
            <input type="checkbox" id="item3" class="checkbox">
            <label for="item3">选项 3 - 橙子</label>
        </div>
        <div class="checkbox-item">
            <input type="checkbox" id="item4" class="checkbox">
            <label for="item4">选项 4 - 葡萄</label>
        </div>
        <div class="checkbox-item">
            <input type="checkbox" id="item5" class="checkbox">
            <label for="item5">选项 5 - 草莓</label>
        </div>
        <div class="checkbox-item">
            <input type="checkbox" id="item6" class="checkbox">
            <label for="item6">选项 6 - 西瓜</label>
        </div>
        <div class="checkbox-item">
            <input type="checkbox" id="item7" class="checkbox">
            <label for="item7">选项 7 - 芒果</label>
        </div>
        <div class="checkbox-item">
            <input type="checkbox" id="item8" class="checkbox">
            <label for="item8">选项 8 - 樱桃</label>
        </div>
    </div>

    <script>
        // 获取所有复选框
        const checkboxes = document.querySelectorAll('.checkbox');
        let lastChecked = null;

        // 为每个复选框添加点击事件监听器
        checkboxes.forEach(checkbox => {
            checkbox.addEventListener('click', handleCheck);
        });

        function handleCheck(e) {
            // 检查是否按下了 Shift 键且不是第一次点击
            if (e.shiftKey && lastChecked && lastChecked !== this) {
                // 确定开始和结束的索引
                const startIndex = Array.from(checkboxes).indexOf(lastChecked);
                const endIndex = Array.from(checkboxes).indexOf(this);
                
                // 确保开始索引小于结束索引
                const [start, end] = startIndex < endIndex ? [startIndex, endIndex] : [endIndex, startIndex];
                
                // 选中范围内的所有复选框
                for (let i = start; i <= end; i++) {
                    checkboxes[i].checked = true;
                }
            }
            
            // 更新最后点击的复选框
            lastChecked = this;
        }

        // 可选:添加全选/全不选功能
        function addSelectAllFeature() {
            const selectAllBtn = document.createElement('button');
            selectAllBtn.textContent = '全选';
            selectAllBtn.style.marginTop = '20px';
            selectAllBtn.style.marginRight = '10px';
            selectAllBtn.style.padding = '8px 16px';
            selectAllBtn.style.border = 'none';
            selectAllBtn.style.borderRadius = '4px';
            selectAllBtn.style.backgroundColor = '#4CAF50';
            selectAllBtn.style.color = 'white';
            selectAllBtn.style.cursor = 'pointer';
            
            const deselectAllBtn = document.createElement('button');
            deselectAllBtn.textContent = '全不选';
            deselectAllBtn.style.marginTop = '20px';
            deselectAllBtn.style.padding = '8px 16px';
            deselectAllBtn.style.border = 'none';
            deselectAllBtn.style.borderRadius = '4px';
            deselectAllBtn.style.backgroundColor = '#f44336';
            deselectAllBtn.style.color = 'white';
            deselectAllBtn.style.cursor = 'pointer';
            
            selectAllBtn.addEventListener('click', () => {
                checkboxes.forEach(checkbox => checkbox.checked = true);
            });
            
            deselectAllBtn.addEventListener('click', () => {
                checkboxes.forEach(checkbox => checkbox.checked = false);
            });
            
            document.querySelector('.checkbox-container').appendChild(selectAllBtn);
            document.querySelector('.checkbox-container').appendChild(deselectAllBtn);
        }

        // 添加全选/全不选功能
        addSelectAllFeature();
    </script>
</body>
</html>

豆包给的代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Shift批量选中复选框</title>
    <style>
        /* 让复选框排成一排,简单美化 */
        .checkbox-group {
            display: flex;
            gap: 20px;
            padding: 20px;
            border: 1px solid #eee;
            width: fit-content;
        }
        .checkbox-item {
            display: flex;
            align-items: center;
            gap: 5px;
        }
    </style>
</head>
<body>
    <div class="checkbox-group" id="checkboxContainer">
        <div class="checkbox-item">
            <input type="checkbox" id="cb1" value="1">
            <label for="cb1">选项1</label>
        </div>
        <div class="checkbox-item">
            <input type="checkbox" id="cb2" value="2">
            <label for="cb2">选项2</label>
        </div>
        <div class="checkbox-item">
            <input type="checkbox" id="cb3" value="3">
            <label for="cb3">选项3</label>
        </div>
        <div class="checkbox-item">
            <input type="checkbox" id="cb4" value="4">
            <label for="cb4">选项4</label>
        </div>
        <div class="checkbox-item">
            <input type="checkbox" id="cb5" value="5">
            <label for="cb5">选项5</label>
        </div>
    </div>

    <script>
        // 1. 获取所有复选框元素
        const checkboxes = document.querySelectorAll('#checkboxContainer input[type="checkbox"]');
        // 2. 记录上一次点击的复选框(批量选中的起点)
        let lastChecked = null;

        // 3. 为每个复选框绑定点击事件
        checkboxes.forEach(checkbox => {
            checkbox.addEventListener('click', handleCheckboxClick);
        });

        // 4. 核心点击事件处理函数
        function handleCheckboxClick(e) {
            // 如果按住了Shift键,且存在上一次点击的复选框,才触发批量选中
            if (e.shiftKey && lastChecked && lastChecked !== this) {
                // 找到所有复选框的数组形式(方便通过索引定位)
                const cbArray = Array.from(checkboxes);
                // 获取起点和当前复选框的索引
                const startIndex = cbArray.indexOf(lastChecked);
                const endIndex = cbArray.indexOf(this);
                // 确定遍历的起始和结束位置(兼容从左到右/从右到左)
                const minIndex = Math.min(startIndex, endIndex);
                const maxIndex = Math.max(startIndex, endIndex);

                // 批量设置中间所有复选框的选中状态(和当前点击的复选框状态一致)
                for (let i = minIndex; i <= maxIndex; i++) {
                    cbArray[i].checked = this.checked;
                }
            }

            // 更新“上一次点击的复选框”(只有当前点击不是通过Shift批量触发时,才更新)
            // 注:如果是普通点击(没按Shift),直接更新起点;如果是Shift点击,也更新(方便连续批量选)
            lastChecked = this;
        }
    </script>
</body>
</html>

通义千问给的代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>复选框Shift批量选中</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            padding: 20px;
            line-height: 1.6;
        }
        
        .container {
            max-width: 500px;
            margin: 0 auto;
            background-color: #f9f9f9;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 2px 10px rgba(0,0,0,0.1);
        }
        
        h1 {
            text-align: center;
            color: #333;
            margin-bottom: 20px;
        }
        
        .item {
            padding: 10px;
            border: 1px solid #ddd;
            margin: 5px 0;
            background-color: white;
            border-radius: 4px;
        }
        
        .item:hover {
            background-color: #f0f8ff;
        }
        
        .instructions {
            background-color: #e7f3ff;
            padding: 10px;
            border-radius: 4px;
            margin-bottom: 20px;
            font-size: 14px;
        }
        
        .status {
            margin-top: 15px;
            padding: 10px;
            background-color: #f0f8ff;
            border-radius: 4px;
            font-weight: bold;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>复选框Shift批量选中示例</h1>
        
        <div class="instructions">
            <p><strong>使用说明:</strong></p>
            <ul>
                <li>点击任意复选框选中/取消选中单个项目</li>
                <li>按住Shift键点击复选框,可以批量选中/取消选中两个复选框之间的所有项目</li>
                <li>按住Ctrl键可单独选择多个不连续的项目</li>
            </ul>
        </div>
        
        <div id="checkboxList">
            <!-- 复选框列表 -->
            <div class="item">
                <label>
                    <input type="checkbox" data-index="0"> 项目 1
                </label>
            </div>
            <div class="item">
                <label>
                    <input type="checkbox" data-index="1"> 项目 2
                </label>
            </div>
            <div class="item">
                <label>
                    <input type="checkbox" data-index="2"> 项目 3
                </label>
            </div>
            <div class="item">
                <label>
                    <input type="checkbox" data-index="3"> 项目 4
                </label>
            </div>
            <div class="item">
                <label>
                    <input type="checkbox" data-index="4"> 项目 5
                </label>
            </div>
            <div class="item">
                <label>
                    <input type="checkbox" data-index="5"> 项目 6
                </label>
            </div>
            <div class="item">
                <label>
                    <input type="checkbox" data-index="6"> 项目 7
                </label>
            </div>
            <div class="item">
                <label>
                    <input type="checkbox" data-index="7"> 项目 8
                </label>
            </div>
            <div class="item">
                <label>
                    <input type="checkbox" data-index="8"> 项目 9
                </label>
            </div>
            <div class="item">
                <label>
                    <input type="checkbox" data-index="9"> 项目 10
                </label>
            </div>
        </div>
        
        <button id="selectAllBtn" style="margin-right: 10px; padding: 8px 15px;">全选</button>
        <button id="clearAllBtn" style="padding: 8px 15px;">清空</button>
        
        <div id="status" class="status">
            当前选中: 0 个项目
        </div>
    </div>

    <script>
        // 获取所有复选框
        const checkboxes = document.querySelectorAll('input[type="checkbox"]');
        let lastChecked = null; // 记录上次点击的复选框
        
        // 用于记录当前选中的复选框数量
        let checkedCount = 0;
        
        // 更新选中数量显示
        function updateStatus() {
            const statusDiv = document.getElementById('status');
            statusDiv.textContent = `当前选中: ${checkedCount} 个项目`;
        }
        
        // 计算选中数量
        function calculateCheckedCount() {
            checkedCount = Array.from(checkboxes).filter(checkbox => checkbox.checked).length;
            updateStatus();
        }
        
        // 为每个复选框添加事件监听器
        checkboxes.forEach(checkbox => {
            checkbox.addEventListener('click', function(e) {
                // 如果按住Shift键
                if (e.shiftKey && lastChecked) {
                    // 获取当前复选框的索引
                    const currentIndex = parseInt(this.getAttribute('data-index'));
                    // 获取上次点击复选框的索引
                    const lastIndex = parseInt(lastChecked.getAttribute('data-index'));
                    
                    // 确定范围
                    const start = Math.min(currentIndex, lastIndex);
                    const end = Math.max(currentIndex, lastIndex);
                    
                    // 批量选中/取消选中范围内的复选框
                    for (let i = start; i <= end; i++) {
                        const targetCheckbox = document.querySelector(`input[data-index="${i}"]`);
                        if (targetCheckbox) {
                            targetCheckbox.checked = this.checked;
                        }
                    }
                    
                    // 重新计算选中数量
                    calculateCheckedCount();
                } else {
                    // 普通点击,更新选中数量
                    if (this.checked) {
                        checkedCount++;
                    } else {
                        checkedCount--;
                    }
                    updateStatus();
                }
                
                // 更新上次点击的复选框
                lastChecked = this;
            });
        });
        
        // 全选按钮事件
        document.getElementById('selectAllBtn').addEventListener('click', function() {
            checkboxes.forEach(checkbox => {
                checkbox.checked = true;
            });
            checkedCount = checkboxes.length;
            updateStatus();
        });
        
        // 清空按钮事件
        document.getElementById('clearAllBtn').addEventListener('click', function() {
            checkboxes.forEach(checkbox => {
                checkbox.checked = false;
            });
            checkedCount = 0;
            updateStatus();
        });
        
        // 初始化选中数量
        calculateCheckedCount();
    </script>
</body>
</html>

deepseek给的代码,完整网页:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Shift批量选中复选框实现</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            font-family: 'Segoe UI', 'Microsoft YaHei', sans-serif;
        }
        
        body {
            background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
            min-height: 100vh;
            padding: 20px;
            color: #333;
        }
        
        .container {
            max-width: 1000px;
            margin: 0 auto;
            padding: 30px;
        }
        
        .header {
            text-align: center;
            margin-bottom: 40px;
            padding-bottom: 20px;
            border-bottom: 1px solid rgba(0, 0, 0, 0.1);
        }
        
        h1 {
            font-size: 2.5rem;
            color: #2c3e50;
            margin-bottom: 10px;
        }
        
        .description {
            font-size: 1.1rem;
            color: #7f8c8d;
            max-width: 800px;
            margin: 0 auto 20px;
            line-height: 1.6;
        }
        
        .instructions {
            background-color: rgba(52, 152, 219, 0.1);
            border-left: 4px solid #3498db;
            padding: 15px;
            border-radius: 4px;
            margin-top: 20px;
        }
        
        .instructions h3 {
            color: #2980b9;
            margin-bottom: 10px;
        }
        
        .instructions ul {
            padding-left: 20px;
        }
        
        .instructions li {
            margin-bottom: 5px;
            line-height: 1.5;
        }
        
        .card {
            background-color: white;
            border-radius: 10px;
            box-shadow: 0 10px 30px rgba(0, 0, 0, 0.08);
            overflow: hidden;
            margin-bottom: 30px;
        }
        
        .card-header {
            background: linear-gradient(to right, #3498db, #2c3e50);
            color: white;
            padding: 20px;
            display: flex;
            justify-content: space-between;
            align-items: center;
        }
        
        .card-header h2 {
            font-size: 1.8rem;
        }
        
        .controls {
            display: flex;
            gap: 10px;
        }
        
        .btn {
            padding: 8px 16px;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            font-weight: 600;
            transition: all 0.2s;
        }
        
        .btn-primary {
            background-color: #2ecc71;
            color: white;
        }
        
        .btn-primary:hover {
            background-color: #27ae60;
        }
        
        .btn-secondary {
            background-color: #e74c3c;
            color: white;
        }
        
        .btn-secondary:hover {
            background-color: #c0392b;
        }
        
        .btn-info {
            background-color: #3498db;
            color: white;
        }
        
        .btn-info:hover {
            background-color: #2980b9;
        }
        
        .items-container {
            padding: 20px;
        }
        
        .selectable-item {
            display: flex;
            align-items: center;
            padding: 15px;
            border-bottom: 1px solid #eee;
            cursor: pointer;
            transition: all 0.2s;
        }
        
        .selectable-item:hover {
            background-color: #f8f9fa;
        }
        
        .selectable-item.selected {
            background-color: #e8f4fc;
            border-left: 4px solid #3498db;
        }
        
        .selectable-item:last-child {
            border-bottom: none;
        }
        
        .item-checkbox {
            margin-right: 15px;
            width: 20px;
            height: 20px;
            cursor: pointer;
        }
        
        .item-content {
            flex-grow: 1;
            display: flex;
            flex-direction: column;
        }
        
        .item-title {
            font-weight: 600;
            font-size: 1.1rem;
            margin-bottom: 5px;
        }
        
        .item-subtitle {
            color: #7f8c8d;
            font-size: 0.9rem;
        }
        
        .item-meta {
            display: flex;
            gap: 10px;
            color: #95a5a6;
            font-size: 0.85rem;
        }
        
        .status {
            padding: 4px 8px;
            border-radius: 12px;
            font-size: 0.75rem;
            font-weight: 600;
        }
        
        .status.pending {
            background-color: #fef9e7;
            color: #f39c12;
        }
        
        .status.completed {
            background-color: #eafaf1;
            color: #27ae60;
        }
        
        .status.in-progress {
            background-color: #ebf5fb;
            color: #3498db;
        }
        
        .footer {
            text-align: center;
            margin-top: 40px;
            padding-top: 20px;
            border-top: 1px solid rgba(0, 0, 0, 0.1);
            color: #7f8c8d;
        }
        
        .selected-count {
            background-color: #3498db;
            color: white;
            padding: 5px 10px;
            border-radius: 20px;
            font-weight: bold;
            margin-left: 10px;
        }
        
        .key-hint {
            display: inline-flex;
            align-items: center;
            background-color: #f8f9fa;
            border: 1px solid #dee2e6;
            border-radius: 4px;
            padding: 3px 8px;
            font-size: 0.9rem;
            margin: 0 5px;
        }
        
        .stats {
            margin-top: 20px;
            display: flex;
            justify-content: space-between;
            padding: 15px;
            background-color: #f8f9fa;
            border-radius: 6px;
        }
        
        .stats-item {
            text-align: center;
        }
        
        .stats-value {
            font-size: 1.8rem;
            font-weight: bold;
            color: #2c3e50;
        }
        
        .stats-label {
            font-size: 0.9rem;
            color: #7f8c8d;
        }
        
        @media (max-width: 768px) {
            .container {
                padding: 15px;
            }
            
            h1 {
                font-size: 2rem;
            }
            
            .controls {
                flex-direction: column;
                width: 100%;
                margin-top: 15px;
            }
            
            .btn {
                width: 100%;
            }
            
            .stats {
                flex-direction: column;
                gap: 15px;
            }
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="header">
            <h1>Shift批量选中复选框</h1>
            <p class="description">
                这是一个模拟Gmail等现代Web应用中Shift批量选中功能的完整实现。
                按住Shift键并点击复选框可以批量选择多个项目,提高操作效率。
            </p>
            <div class="instructions">
                <h3>使用说明</h3>
                <ul>
                    <li>点击单个复选框可以选中/取消选中该项目</li>
                    <li>按住 <span class="key-hint">Shift</span> 键并点击复选框,可以选中两个复选框之间的所有项目</li>
                    <li>使用下方的控制按钮可以快速全选、取消全选或反选所有项目</li>
                    <li>当前已选中 <span id="selectedCount" class="selected-count">0</span> 个项目</li>
                </ul>
            </div>
        </div>
        
        <div class="card">
            <div class="card-header">
                <h2>任务列表</h2>
                <div class="controls">
                    <button id="selectAllBtn" class="btn btn-primary">全选</button>
                    <button id="deselectAllBtn" class="btn btn-secondary">取消全选</button>
                    <button id="invertSelectionBtn" class="btn btn-info">反选</button>
                </div>
            </div>
            
            <div class="items-container" id="itemsContainer">
                <!-- 项目将通过JavaScript动态生成 -->
            </div>
            
            <div class="stats">
                <div class="stats-item">
                    <div class="stats-value" id="totalCount">10</div>
                    <div class="stats-label">总项目数</div>
                </div>
                <div class="stats-item">
                    <div class="stats-value" id="selectedStat">0</div>
                    <div class="stats-label">已选中</div>
                </div>
                <div class="stats-item">
                    <div class="stats-value" id="pendingCount">5</div>
                    <div class="stats-label">待处理</div>
                </div>
                <div class="stats-item">
                    <div class="stats-value" id="completedCount">2</div>
                    <div class="stats-label">已完成</div>
                </div>
            </div>
        </div>
        
        <div class="footer">
            <p>Shift批量选中复选框实现 &copy; 2023 | 按住Shift键实现高效批量选择</p>
        </div>
    </div>

    <script>
        // 模拟数据
        const itemsData = [
            { id: 1, title: "完成项目报告", subtitle: "整理Q3季度项目数据和分析", status: "pending", date: "2023-10-15" },
            { id: 2, title: "设计评审会议", subtitle: "与设计团队讨论新UI方案", status: "completed", date: "2023-10-14" },
            { id: 3, title: "代码重构", subtitle: "优化用户模块的性能问题", status: "in-progress", date: "2023-10-16" },
            { id: 4, title: "客户演示准备", subtitle: "准备产品演示材料和演讲稿", status: "pending", date: "2023-10-18" },
            { id: 5, title: "团队周会", subtitle: "每周团队进度同步和计划", status: "completed", date: "2023-10-13" },
            { id: 6, title: "更新技术文档", subtitle: "根据最新API变更更新文档", status: "pending", date: "2023-10-17" },
            { id: 7, title: "性能测试", subtitle: "对系统进行负载测试", status: "in-progress", date: "2023-10-16" },
            { id: 8, title: "安全性审计", subtitle: "检查系统潜在的安全漏洞", status: "pending", date: "2023-10-19" },
            { id: 9, title: "新功能规划", subtitle: "与产品经理讨论下一阶段功能", status: "pending", date: "2023-10-20" },
            { id: 10, title: "用户反馈分析", subtitle: "分析最近收集的用户反馈", status: "in-progress", date: "2023-10-15" }
        ];

        class ShiftSelect {
            constructor(containerId, itemsData) {
                this.container = document.getElementById(containerId);
                this.itemsData = itemsData;
                this.items = [];
                this.lastSelected = null;
                this.shiftKeyPressed = false;
                
                this.init();
                this.renderItems();
                this.setupEventListeners();
                this.updateStats();
            }
            
            init() {
                // 监听键盘事件以检测Shift键状态
                document.addEventListener('keydown', (e) => {
                    if (e.key === 'Shift') {
                        this.shiftKeyPressed = true;
                    }
                });
                
                document.addEventListener('keyup', (e) => {
                    if (e.key === 'Shift') {
                        this.shiftKeyPressed = false;
                    }
                });
                
                // 点击页面其他地方时重置Shift状态(防止Shift键卡住)
                document.addEventListener('click', (e) => {
                    if (!e.shiftKey) {
                        this.shiftKeyPressed = false;
                    }
                });
            }
            
            renderItems() {
                this.container.innerHTML = '';
                
                this.itemsData.forEach((itemData, index) => {
                    const itemElement = document.createElement('div');
                    itemElement.className = 'selectable-item';
                    itemElement.dataset.id = itemData.id;
                    itemElement.dataset.index = index;
                    
                    const statusClass = `status ${itemData.status}`;
                    const statusText = itemData.status === 'pending' ? '待处理' : 
                                     itemData.status === 'completed' ? '已完成' : '进行中';
                    
                    itemElement.innerHTML = `
                        <input type="checkbox" class="item-checkbox" id="item-${itemData.id}">
                        <div class="item-content">
                            <div class="item-title">${itemData.title}</div>
                            <div class="item-subtitle">${itemData.subtitle}</div>
                            <div class="item-meta">
                                <span>${itemData.date}</span>
                                <span class="${statusClass}">${statusText}</span>
                            </div>
                        </div>
                    `;
                    
                    this.container.appendChild(itemElement);
                    this.items.push(itemElement);
                });
                
                // 为每个项目添加事件监听
                this.items.forEach(item => {
                    const checkbox = item.querySelector('.item-checkbox');
                    
                    // 点击项目本身
                    item.addEventListener('click', (e) => {
                        // 如果点击的是复选框,不重复处理
                        if (e.target === checkbox) return;
                        
                        e.preventDefault();
                        this.handleItemClick(item, !checkbox.checked, e);
                    });
                    
                    // 点击复选框
                    checkbox.addEventListener('click', (e) => {
                        this.handleCheckboxClick(e, item);
                    });
                });
            }
            
            handleItemClick(item, checked, event) {
                const checkbox = item.querySelector('.item-checkbox');
                
                if (this.shiftKeyPressed && this.lastSelected && this.lastSelected !== item) {
                    this.selectRange(item, this.lastSelected, checked);
                } else {
                    this.toggleItem(item, checked);
                }
                
                if (!this.shiftKeyPressed) {
                    this.lastSelected = item;
                }
                
                this.updateStats();
            }
            
            handleCheckboxClick(event, item) {
                const checkbox = event.target;
                
                if (this.shiftKeyPressed && this.lastSelected && this.lastSelected !== item) {
                    this.selectRange(item, this.lastSelected, checkbox.checked);
                } else {
                    this.toggleItem(item, checkbox.checked);
                }
                
                if (!this.shiftKeyPressed) {
                    this.lastSelected = item;
                }
                
                this.updateStats();
            }
            
            selectRange(currentItem, lastItem, checked) {
                const itemsArray = this.items;
                const startIndex = parseInt(lastItem.dataset.index);
                const endIndex = parseInt(currentItem.dataset.index);
                
                // 确定开始和结束索引
                const start = Math.min(startIndex, endIndex);
                const end = Math.max(startIndex, endIndex);
                
                // 选中范围内的所有项目
                for (let i = start; i <= end; i++) {
                    const checkbox = itemsArray[i].querySelector('.item-checkbox');
                    if (checkbox) {
                        checkbox.checked = checked;
                        this.toggleItem(itemsArray[i], checked);
                    }
                }
            }
            
            toggleItem(item, checked) {
                if (checked) {
                    item.classList.add('selected');
                } else {
                    item.classList.remove('selected');
                }
            }
            
            selectAll() {
                this.items.forEach(item => {
                    const checkbox = item.querySelector('.item-checkbox');
                    checkbox.checked = true;
                    this.toggleItem(item, true);
                });
                this.updateStats();
            }
            
            deselectAll() {
                this.items.forEach(item => {
                    const checkbox = item.querySelector('.item-checkbox');
                    checkbox.checked = false;
                    this.toggleItem(item, false);
                });
                this.lastSelected = null;
                this.updateStats();
            }
            
            invertSelection() {
                this.items.forEach(item => {
                    const checkbox = item.querySelector('.item-checkbox');
                    checkbox.checked = !checkbox.checked;
                    this.toggleItem(item, checkbox.checked);
                });
                this.updateStats();
            }
            
            updateStats() {
                const selectedItems = this.getSelectedItems();
                const selectedCount = selectedItems.length;
                
                // 更新选中计数
                document.getElementById('selectedCount').textContent = selectedCount;
                document.getElementById('selectedStat').textContent = selectedCount;
                
                // 更新待处理和已完成计数
                const pendingCount = this.itemsData.filter(item => item.status === 'pending').length;
                const completedCount = this.itemsData.filter(item => item.status === 'completed').length;
                
                document.getElementById('pendingCount').textContent = pendingCount;
                document.getElementById('completedCount').textContent = completedCount;
                document.getElementById('totalCount').textContent = this.itemsData.length;
            }
            
            getSelectedItems() {
                return this.items.filter(item => {
                    const checkbox = item.querySelector('.item-checkbox');
                    return checkbox && checkbox.checked;
                });
            }
            
            setupEventListeners() {
                // 全选按钮
                document.getElementById('selectAllBtn').addEventListener('click', () => {
                    this.selectAll();
                });
                
                // 取消全选按钮
                document.getElementById('deselectAllBtn').addEventListener('click', () => {
                    this.deselectAll();
                });
                
                // 反选按钮
                document.getElementById('invertSelectionBtn').addEventListener('click', () => {
                    this.invertSelection();
                });
            }
        }

        // 页面加载完成后初始化
        document.addEventListener('DOMContentLoaded', () => {
            const shiftSelect = new ShiftSelect('itemsContainer', itemsData);
            
            // 添加一个简单的键盘快捷键提示
            document.addEventListener('keydown', (e) => {
                // Ctrl+A 全选
                if (e.ctrlKey && e.key === 'a') {
                    e.preventDefault();
                    shiftSelect.selectAll();
                }
                
                // ESC 取消全选
                if (e.key === 'Escape') {
                    shiftSelect.deselectAll();
                }
            });
        });
    </script>
</body>
</html>