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

JS动态创建file input后无法绑定onchange实现前置文件大小校验

动态文件输入框的文件大小校验问题排查与修复

问题1:事件绑定方式错误

你用 input.onchange = 'upload_check()' 的方式绑定事件是错误的——这种字符串赋值的写法只在HTML标签内写 onchange="upload_check()" 时有效,通过JS动态绑定DOM0级事件时,应该直接赋值函数引用,而非字符串形式的函数调用。

问题2:校验函数只能固定校验第一个输入框

你的 upload_check() 函数里硬编码了 document.getElementById("file1"),但动态创建的输入框id是 file1 到 file10,这会导致只有第一个输入框的文件能被校验,后续创建的输入框选择文件时,函数还是会去拿第一个输入框的文件,完全起不到对应校验的作用。

修复方案

步骤1:修正事件绑定方式

在 createNewFiled 函数中,把 input.onchange = 'upload_check()'; 改成以下两种方式之一:

  • 方式一(DOM0级事件):直接赋值函数
input.onchange = upload_check;
  • 方式二(DOM2级事件,更推荐,支持绑定多个事件):
input.addEventListener('change', upload_check);

步骤2:修改校验函数,适配所有动态创建的输入框

修改 upload_check 函数,通过 event.target 获取当前触发事件的输入框元素,而非固定获取id为 file1 的元素:

function upload_check(event) {
    // 获取当前触发事件的文件输入框
    var upl = event.target;
    // 限制为1000000字节(约0.95MB)
    var max = 1000000;

    // 先判断是否选择了文件,避免未选文件时报错
    if (upl.files.length > 0 && upl.files[0].size > max) {
        alert("文件过大!");
        upl.value = ""; // 清空文件选择
    }
};

完整修正后的createNewFiled函数示例

var counter = 0;
var incrementBtn = document.getElementById('incrementBtn');
var attachments = document.getElementById('attachments');

var createNewFiled = function() {
    counter++;

    if (counter <= 10) {
        var input = document.createElement("input");
        var br = document.createElement("br");
        var br2 = document.createElement("br");

        input.id = 'file'+counter;
        input.classList.add("inputClass");
        input.type = 'file';
        input.name = 'file'+counter;
        
        // 修正事件绑定
        input.addEventListener('change', upload_check);
        
        attachments.appendChild(input);
        attachments.appendChild(br);
        attachments.appendChild(br2);
    }
    else {
        alert('最多只能添加10个附件');
    }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 13:02:15