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

首个Ajax监听器后续绑定不生效 如何同时监听两个表单提交事件

问题根因

你使用的$(选择器).submit()是直接事件绑定,仅会对绑定执行时已经存在于DOM中的元素生效:

  • 若#form-2是提交#form-1后才动态插入到页面的,初始化绑定事件时DOM中不存在该元素,事件绑定自然失效
  • 若脚本加载位置早于DOM渲染,哪怕初始页面就存在#form-2,绑定时还没渲染出该元素,同样不会生效

解决方案

使用事件委托,把#form-2的提交事件绑定在页面初始化时就已经存在的父级元素上(比如#user-info或者document),利用事件冒泡机制匹配动态生成的元素,修改后的代码如下:

// #form-1 初始就存在,可保留原有直接绑定逻辑
$('#form-1').submit(function(e) {
    e.preventDefault();
    const user = $(this).serialize();
    $.post('/user', user, function(data) {
        // 清空原有内容避免重复插入
        $('#user-info').empty().append(
           `<p>Username: ${data.username}</p>
            <form action="/user?_method=PATCH" method="POST" id="form-2">
            <input type="email" id="user-email" name="user-email">
            <button>Submit</button>
            </form>`
        )
    });
});

// #form-2 使用事件委托绑定到document(也可替换为最近的静态父元素#user-info)
$(document).on('submit', '#form-2', function(e) {
    e.preventDefault();
    const user = $(this).serialize();
    $.ajax({
        url: '/user',
        data: user,
        type: 'PATCH',
        success: function(data) {
            $('#user-info').empty().append(
           `<p>Username: ${data.username}</p>
            <p>Email: ${data.email}</p>`
        )
        }
    });
});

补充说明

  • 原有代码中使用append()会持续往容器中追加内容,容易出现重复的用户名、表单元素,建议插入新内容前先调用empty()清空旧内容
  • 事件委托的匹配逻辑是父元素收到冒泡的事件后,判断触发源是否匹配目标选择器,所以不管元素是初始渲染还是后续动态插入,都能正常触发回调
  • 如有其他异常可打开浏览器开发者工具的控制台,排查是否有JS语法错误、接口请求报错等问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:24:07