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

jQuery多表单提交问题:捕获单个表单submit事件并阻止页面刷新

解决多表单组件上传时页面刷新的问题

问题场景

页面中有1~10个以组件形式存在的图片上传表单,尝试动态捕获对应表单的submit事件,但提交时页面会直接刷新。

表单代码

<form id="med_blog_form_<?=$b['blog_med_id']?>" name="med_blog_form" class="med_blog_form" action="#" method="post">
    <label for="media_blog_file_<?=$b['blog_med_id']?>">
         <div class="btn_sm edit_blog_med_btn">UPLOAD</div>
         <input type="file" id="media_blog_file_<?=$b['blog_med_id']?>" data-blog_med_id="<?=$b['blog_med_id']?>" class="media_blog_file" name="media_upload" hidden/>
         <input type="hidden" name="upload_type" value="blog_media_upload" />
         <input type="hidden" name="blog_id" value="<?=$blog_id?>" />
         <input type="hidden" name="filename" value="<?=$b['src']?>" />
     </label>
</form>

原jQuery代码

$(".media_blog_file").change(function() {

    blog_med_id = $(this).data("blog_med_id");

    this_form = $(this).closest("form");
    this_form.submit();

    this_form.on('submit',(function(e) {

        e.preventDefault();

        alert("form submit "+blog_med_id);
        //do other stuff here...

    })
    )

})

问题原因

原代码逻辑顺序错误:先调用this_form.submit()触发了表单的默认提交行为,之后才绑定submit事件。此时页面刷新的操作已经执行,后续绑定的事件根本无法生效。

修正方案

方案1:提前给所有表单绑定submit事件

将submit事件绑定放在change事件外部,确保触发提交时事件已存在:

// 先给所有上传表单绑定submit事件
$(".med_blog_form").on('submit', function(e) {
    e.preventDefault();
    // 获取当前表单对应的blog_med_id
    const blog_med_id = $(this).find(".media_blog_file").data("blog_med_id");
    alert("form submit " + blog_med_id);
    // 在这里执行文件上传逻辑,比如FormData提交等
});

// 文件选择change事件
$(".media_blog_file").change(function() {
    const this_form = $(this).closest("form");
    // 触发表单提交
    this_form.submit();
});

方案2:在change事件中直接处理逻辑

无需触发submit,直接在文件选择事件里处理上传逻辑:

$(".media_blog_file").change(function(e) {
    // 阻止默认行为
    e.preventDefault();
    
    const blog_med_id = $(this).data("blog_med_id");
    const this_form = $(this).closest("form");
    
    alert("form submit " + blog_med_id);
    // 示例:执行AJAX上传逻辑
    // const formData = new FormData(this_form[0]);
    // $.ajax({
    //     url: '你的上传接口地址',
    //     type: 'POST',
    //     data: formData,
    //     processData: false,
    //     contentType: false,
    //     success: function(res) {
    //         // 处理上传成功回调
    //     }
    // });
});

补充说明

如果表单是通过AJAX动态生成的,需要用事件委托的方式绑定submit事件:

$(document).on('submit', ".med_blog_form", function(e) {
    e.preventDefault();
    const blog_med_id = $(this).find(".media_blog_file").data("blog_med_id");
    alert("form submit " + blog_med_id);
    // 上传逻辑
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 00:37:41