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

通过JQuery动态添加的表单存在于DOM但不可见问题求助

解决动态添加表格行无法显示的问题

你的代码存在HTML结构违规的问题,这是导致行存在于DOM但无法显示的核心原因:

  • <td> 必须是 <tr> 的直接子元素,不能被 <form> 直接包裹
  • <tr> 的直接子元素只能是 <td> 或 <th>,不能是 <form>

浏览器遇到非法DOM结构时会自动修正,把你的<form>和内部的<td>移出到<tr>甚至<table>之外,最终导致你添加的<tr>是空节点,所以呈现出类似灰色不可见的状态。

方案一:用form属性关联表单控件

将表单放在其中一个<td>内,其他所有表单控件通过form属性关联到这个表单,保持表格结构的合法性:

function generateUpdateForm(event, ereignis) {
    // 移除之前添加的编辑行
    $('#test-modal-created-update-row').remove();

    // 判断选项是否选中
    let isSelected = (aktion, value) => aktion === value ? "selected" : "";

    // 从缓存获取仓库地点
    let lagerorte = JSON.parse(localStorage.getItem('lagerorte'));
    let lagerorteLabel = lagerorte.map(value => value.lagerort);

    // 创建编辑行
    let row = $(`<tr id='test-modal-created-update-row'></tr>`);

    // 创建表单并放入第一个td
    let form = $(`<form id="test-modal-created-update-row-form"></form>`);
    let firstTd = $(`<td></td>`).append(form);
    form.append(`<input name="ereignis_id" type='text' value='${ereignis.ereignis_id}' style='display: none'>`);

    // 动作选择框td,通过form属性关联表单
    let actionTd = $(`<td>
        <select class="form-input input-selection" name="aktion" form="test-modal-created-update-row-form">
            <option ${isSelected(ereignis.aktion, "Anlage")} value="Anlage">Anlage</option>
            <option ${isSelected(ereignis.aktion, "in Bearbeitung")} value="in Bearbeitung">in Bearbeitung</option>
            <option ${isSelected(ereignis.aktion, "Umlage")} value="Umlage">Umlage</option>
            <option ${isSelected(ereignis.aktion, "Rückgabe")} value="Rückgabe">Rückgabe</option>
            <option ${isSelected(ereignis.aktion, "Abtrennung")} value="Abtrennung">Abtrennung</option>
        </select>
    </td>`);

    // 仓库地点输入框td,关联表单
    let locationTd = $(`<td>
        <input name="lagerort" class="form-input input-text" id="test-modal-created-update-row-lagerort" 
               type='text' value='${ereignis.lagerort}' form="test-modal-created-update-row-form">
    </td>`);

    // 按钮td,关联表单
    let buttonTd = $(`<td colspan="2" class="test-modal-created-update-row-button-container">
        <button type="submit" class="pri-button" value="submit" form="test-modal-created-update-row-form">Änderung speichern</button>
    </td>`);

    // 将所有td添加到行中
    row.append(firstTd, actionTd, locationTd, buttonTd);

    // 插入到目标行下方
    $(event.currentTarget).after(row);

    // 初始化自动补全
    $('#test-modal-created-update-row-lagerort').autocomplete({
        source: lagerorteLabel
    });

    // 绑定提交事件
    $('#test-modal-created-update-row-form').on("submit", (event) => {
        submitUpdatedEreignis(event);
    });
}

方案二:用colspan的td包裹整个表单

用一个覆盖所有列的<td>包裹表单,在表单内部用CSS Grid模拟表格列布局,这种方式更简洁:

function generateUpdateForm(event, ereignis) {
    $('#test-modal-created-update-row').remove();

    let isSelected = (aktion, value) => aktion === value ? "selected" : "";

    let lagerorte = JSON.parse(localStorage.getItem('lagerorte'));
    let lagerorteLabel = lagerorte.map(value => value.lagerort);

    let row = $(`<tr id='test-modal-created-update-row'></tr>`);

    // 创建覆盖所有列的td(假设原表格为5列,根据实际情况调整colspan值)
    let formTd = $(`<td colspan="5"></td>`);
    // 用CSS Grid模拟表格列布局
    let form = $(`<form id="test-modal-created-update-row-form" style="display: grid; grid-template-columns: repeat(5, 1fr); gap: 8px; align-items: center; padding: 8px 0;"></form>`);

    // 向表单添加所有元素
    form.append(`
        <div><input name="ereignis_id" type='text' value='${ereignis.ereignis_id}' style='display: none'></div>
        <div>
            <select class="form-input input-selection" name="aktion">
                <option ${isSelected(ereignis.aktion, "Anlage")} value="Anlage">Anlage</option>
                <option ${isSelected(ereignis.aktion, "in Bearbeitung")} value="in Bearbeitung">in Bearbeitung</option>
                <option ${isSelected(ereignis.aktion, "Umlage")} value="Umlage">Umlage</option>
                <option ${isSelected(ereignis.aktion, "Rückgabe")} value="Rückgabe">Rückgabe</option>
                <option ${isSelected(ereignis.aktion, "Abtrennung")} value="Abtrennung">Abtrennung</option>
            </select>
        </div>
        <div><input name="lagerort" class="form-input input-text" id="test-modal-created-update-row-lagerort" type='text' value='${ereignis.lagerort}'></div>
        <div style="grid-column: span 2;"><button type="submit" class="pri-button" value="submit">Änderung speichern</button></div>
    `);

    formTd.append(form);
    row.append(formTd);

    $(event.currentTarget).after(row);

    $('#test-modal-created-update-row-lagerort').autocomplete({
        source: lagerorteLabel
    });

    $('#test-modal-created-update-row-form').on("submit", (event) => {
        submitUpdatedEreignis(event);
    });
}

两种方案都修正了DOM结构的合法性,浏览器不会再自动移动元素,添加的表格行就能正常显示。你可以根据自己的布局需求选择其中一种。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 01:52:05