jQuery .on() 动态创建的表单

jQuery .on() with dynamically created forms

起初我尝试使用 .submit() 但读到它不适用于动态生成的元素(在 DOM 准备好之后)。所以我尝试了.on()。它在一个脚本中工作,但我无法让它与按钮点击一起工作。

表单是动态放置的。我正在使用 bootstrap-tables 将 JSON 加载到 table 中,表单是通过的 JSON 的一部分。每页最多有 100 个表格。

这是我的表单及其所在的 table 结构:

<table id="report-table">
    <tbody>
        <tr>
            <td></td><td></td><td></td>
            <td>
                <form>
                    <input type="text" />
                    <button type="submit" id="add_tag">Add Tag</button>
                </form>
            </td>
        </tr>
    </tbody>
</table>

我试过:

//I'm assuming this didn't work because the form was generated using JS
$(".add_tag").click( function(e) {
    e.preventDefault();
    alert("button clicked");
});

//Same reasoning as above
$("form").submit( function(e) {
    e.preventDefault();
    alert("button clicked");
});

//Not sure why this worn't work
$( "#report-table tbody tr td form button" ).on( "click", function(e) {
    e.preventDefault(); //this doesn't even work.
    alert("button clicked");
});

有什么想法吗?

要回答评论中的问题,不同之处在于处理程序需要附加到页面实际加载时 DOM 中的内容。由于您的按钮最初不存在,因此无法直接向其注册处理程序,除非您在 按钮创建并添加到 DOM 之后添加处理程序

不过,由于您有很多这样的按钮,事件委托对您来说会更高效。不是注册 100 个左右的单独处理程序,每个按钮一个,整个#report-table 你只有 一个

此方法利用事件 "bubble" 通过调度事件的元素的所有祖先(父元素和父元素的父元素)这一事实。事件对象包含对派发它的原始元素的引用。

因此,当您使用委托模式时:

$("#report-table").on("click", "button", function(e)...

report-table 元素在事件冒泡后获得点击。然后它读取事件对象并检查调度事件的元素是否与 on 方法的第二个参数中的元素匹配,在本例中是您的按钮。如果匹配,则运行回调函数,如果不匹配,则不运行。

正如我在评论中所说,jquery.com 网站上有一个非常好的且更详细的解释。

这里有两个观察结果

  1. "add_tag" 是 'id',不是 'class'

变化自

$(".add_tag").click( function(e) {
    e.preventDefault();
    alert("button clicked");
});

$("#add_tag").click( function(e) {
    e.preventDefault();
    alert("button clicked");
});
  1. 同意其他人answer/comments使用事件委托。

更改
$( "#report-table tbody tr td form button" ).on( "click", function(e) {

$("#report-table").on("click", "button", function(e) {