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

嵌套表格内的表单元素无法提交数据,请求技术协助

问题原因与解决方案

问题根源

你动态生成的是<input type='button'>元素,这类控件不会被表单的serializeArray()方法收集——表单序列化仅针对用于提交数据的控件(如text、hidden、checkbox、radio等),button类型的输入仅用于触发交互,默认不参与表单数据提交,哪怕添加了value属性也没用,所以formData返回空数组。

解决方案

方案一:用隐藏输入+模拟按钮(推荐)

将button替换为hidden输入(负责提交数据),同时用带样式的div模拟按钮交互,既保留原有视觉和操作逻辑,又能让表单正常收集数据。

修改populate函数中创建控件的代码:

// 替换原按钮创建代码
$(newCell).append(`
  <input type="hidden" name="${position}" value="on" form="display">
  <div class="btn on" data-position="${position}"></div>
`);

// 绑定点击事件到模拟按钮
$(newCell.find('.btn')).click(function () {
    let inputType = $("input:checked").val();
    let hiddenInput = $(`input[name="${$(this).data('position')}"]`);
    
    if (inputType == "lights" && !$(this).hasClass("wall")) {
        $(this).toggleClass("on off");
        hiddenInput.val($(this).hasClass('on') ? 'on' : 'off');
    } else if (inputType == "walls") {
        $(this).toggleClass("wall");
        // 同步墙状态到隐藏输入
        const currentState = $(this).hasClass('wall') ? 'wall' : ($(this).hasClass('on') ? 'on' : 'off');
        hiddenInput.val(currentState);
    }
});

在CSS中添加模拟按钮的样式(与原按钮样式保持一致):

.btn {
    width: 1.5em;
    height: 1.5em;
    font-size: inherit;
    margin-bottom: 0.1em;
    margin-left: 0.1em;
    padding: 0;
    cursor: pointer;
}
.btn.on {
    background-color: var(--inputBg);
    border: var(--border);
}
.btn.off {
    background-color: darkgrey;
    border: 2px solid grey;
}
.btn.wall {
    background-color: transparent;
    border: 2px solid transparent;
}

方案二:提交时手动收集状态

如果不想修改DOM结构,可以在表单提交时遍历所有按钮,手动提取状态并组装成数据:

$("#display").submit(function (e) {
    e.preventDefault();
    
    const formData = [];
    // 遍历所有按钮控件
    $('#display table input[type="button"]').each(function() {
        const $btn = $(this);
        let value;
        if ($btn.hasClass('wall')) {
            value = 'wall';
        } else {
            value = $btn.hasClass('on') ? 'on' : 'off';
        }
        formData.push({
            name: $btn.attr('name'),
            value: value
        });
    });
    
    console.log(formData);
});

这种方法无需调整DOM,但要确保每个按钮的name属性正确,且状态判断逻辑与交互逻辑一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 23:45:53