You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现弹窗选择科目并填入对应 timetable 单元格(解决单ID生效问题)

问题描述

我正在制作课程表,需求是点击表格单元格时弹出包含各学科的弹窗,选中科目后弹窗关闭,且该科目填入点击的单元格。但现有代码仅对带有id="selectText"的单个单元格生效,无法实现所有单元格独立选择并填入内容。

原代码

HTML

<div class="popup-table">
        <div class="popup-window">
            <div class="close-popup" onclick="closingPopUp()">
                <h4>X</h4>
            </div>
            <p class="options">Deu</p>
            <p class="options">Eng</p>
            <p class="options">Mat</p>
            <p class="options">Erd</p>
            <p class="options">Ges</p>
            <p class="options">Mus</p>
            <p class="options">Kun</p>
            <p class="options">Spo</p>
            <p class="options">Che</p>
            <p class="options">Phy</p>
            <p class="options">Bio</p>
            <p class="options">Fra</p>
            <p class="options">Spa</p>
            <p class="options">Pol</p>
        </div>
    </div>
    
    <div class="table">
        <div class="row headline">
            <p>Std</p>
            <p>Mo</p>
            <p>Di</p>
            <p>Mi</p>
            <p>Do</p>
            <p>Fr</p>
        </div>
        <div class="row extra">
            <p>1</p>
            <p id="selectText" onclick="openPopUp()"></p>
            <p onclick="openPopUp()"></p>
            <p onclick="openPopUp()"></p>
            <p onclick="openPopUp()"></p>
            <p onclick="openPopUp()"></p>
        </div>
        <div class="row">
            <p>2</p>
            <p onclick="openPopUp()"></p>
            <p onclick="openPopUp()"></p>
            <p onclick="openPopUp()"></p>
            <p onclick="openPopUp()"></p>
            <p onclick="openPopUp()"></p>
        </div>
</div>

JavaScript

let row = document.querySelectorAll(".row");
let popUp = document.querySelector(".popup-table");
let closePopUp = document.querySelector(".close-popup");
let options = document.getElementsByClassName("options");
let selectText = document.getElementById("selectText");

function openPopUp() {
    popUp.classList.add("show")
}

function closingPopUp() {
    popUp.classList.remove("show")
}

for(option of options){
    option.onclick = function(){
        selectText.innerHTML = this.textContent;
        closingPopUp();
    }
}

修改方案

核心逻辑是记录当前点击的单元格,让弹窗知道要把科目填入哪个位置,而不是固定指向单个id元素。

1. 调整HTML(规范管理可点击单元格)

去掉单个单元格的id="selectText",给所有可点击的单元格统一加类class="class-cell",并修改点击事件传递当前元素:

<div class="table">
    <div class="row headline">
        <p>Std</p>
        <p>Mo</p>
        <p>Di</p>
        <p>Mi</p>
        <p>Do</p>
        <p>Fr</p>
    </div>
    <div class="row extra">
        <p>1</p>
        <p class="class-cell" onclick="openPopUp(this)"></p>
        <p class="class-cell" onclick="openPopUp(this)"></p>
        <p class="class-cell" onclick="openPopUp(this)"></p>
        <p class="class-cell" onclick="openPopUp(this)"></p>
        <p class="class-cell" onclick="openPopUp(this)"></p>
    </div>
    <div class="row">
        <p>2</p>
        <p class="class-cell" onclick="openPopUp(this)"></p>
        <p class="class-cell" onclick="openPopUp(this)"></p>
        <p class="class-cell" onclick="openPopUp(this)"></p>
        <p class="class-cell" onclick="openPopUp(this)"></p>
        <p class="class-cell" onclick="openPopUp(this)"></p>
    </div>
</div>

2. 修改JavaScript(记录当前单元格并动态填入内容)

新增变量存储当前点击的单元格,在选择科目时将内容填入该单元格:

let popUp = document.querySelector(".popup-table");
let closePopUp = document.querySelector(".close-popup");
let options = document.getElementsByClassName("options");
let currentCell = null; // 存储当前点击的单元格

function openPopUp(cell) {
    currentCell = cell; // 记录点击的单元格
    popUp.classList.add("show");
}

function closingPopUp() {
    popUp.classList.remove("show");
    currentCell = null; // 关闭弹窗后清空记录
}

for(let option of options){
    option.onclick = function(){
        if(currentCell) { // 确保有选中的单元格
            currentCell.innerHTML = this.textContent;
            closingPopUp();
        }
    }
}

3. 可选优化:事件委托(适配动态单元格)

如果后续需要动态添加课程表单元格,用事件委托代替逐个绑定onclick,更高效且无需重复绑定事件:

HTML 调整(去掉单元格的onclick)

<div class="table">
    <!-- ... 其他内容 ... -->
    <div class="row extra">
        <p>1</p>
        <p class="class-cell"></p>
        <p class="class-cell"></p>
        <p class="class-cell"></p>
        <p class="class-cell"></p>
        <p class="class-cell"></p>
    </div>
    <!-- ... 其他内容 ... -->
</div>

JavaScript 新增事件监听

// 给表格容器绑定点击事件,自动识别可点击单元格
document.querySelector(".table").addEventListener("click", function(e) {
    if(e.target.classList.contains("class-cell")) {
        currentCell = e.target;
        popUp.classList.add("show");
    }
});

内容的提问来源于stack exchange,提问作者Dunkelbunt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 14:10:28