【问题标题】:The <tr> click event is not working when data added by jQuery ajax [duplicate]jQuery ajax 添加数据时,<tr> 单击事件不起作用 [重复]
【发布时间】:2019-01-01 15:01:47
【问题描述】:

这里是 mvc webgrid 代码:

@grid.GetHtml(
                displayHeader: false,
                htmlAttributes: new { id = "Grid1" },
                 tableStyle: "webgrad4",
                columns: new[] {
              gridRight.Column(columnName: "Dept_ID", header: "Dept ID"),
              gridRight.Column(columnName: "Inv_ID", header: "Inv ID"),
                   gridRight.Column(columnName: "Inv_NAME", header: "Inv Name"),
                    gridRight.Column(columnName: "U_ID", header: "User ID"),
                     gridRight.Column(columnName: "SEC_ID", header: "SEC ID")
                    })

这个javascript代码:

$(document).ready(function () {
    $('#Grid1 tr').click(function () {
    alert("test");
        $(this).addClass('selectRow');
        var rowId = $(this).closest("tr").find("td:first").html();
        var rowId2 = $(this).closest("tr").find("td:nth-child(2)").html();
        $("#RightRecID").val(rowId);
        $("#RightRecID2").val(rowId2);
        $("#RightGridID").val("Grid1");
        $('#Grid1 tr').not(this).removeClass('selectRow');
    });
});

默认情况下,当数据加载到 webgrid 时,上述代码运行良好。但是在下面的 ajax 代码生成表格行的数据并附加到 webgrid 之后,点击事件不起作用。

 $.each(response, function (j, dataval) {
      $("#Grid1").append('<tr><td>' + (dataval.DEPT_ID == null ? "" : dataval.DEPT_ID) + '</td> + <td>' + dataval.Inv_ID + '</td> +<td>' + dataval.Inv_NAME + '</td><td>' +
            (dataval.U_ID == null ? "" : dataval.U_ID) + '</td><td> ' + (dataval.SEC_ID == null ? "" : dataval.SEC_ID) + '</td></tr>');
        pageCount = dataval.PageCount;      
    });

我也尝试像这样添加 ajax 添加的 tr 的 id:

  $.each(response, function (j, dataval) {
      $("#Grid1").append('<tr id = "newRowID"><td>' + (dataval.DEPT_ID == null ? "" : dataval.DEPT_ID) + '</td> + <td>' + dataval.Inv_ID + '</td> +<td>' + dataval.Inv_NAME + '</td><td>' +
            (dataval.U_ID == null ? "" : dataval.U_ID) + '</td><td> ' + (dataval.SEC_ID == null ? "" : dataval.SEC_ID) + '</td></tr>');
        pageCount = dataval.PageCount;

    });

然后为上面的代码创建了一个简单的测试:

$(document).ready(function () {
    $('#newRowID').on('click', function () {
        alert("test1");
    });

click事件完全没有触发alert,从F12键调试可以看到id "newRowID"被添加了,但是无法识别,有没有其他办法解决这个问题?谢谢

已编辑:最终,ajax 动态创建的表格行应该使用与默认表格数据的点击事件相同的代码,如下所示:

$(document).ready(function () {
$('#newRowID').on('click', function () {
    alert("test1");
    $(this).addClass('selectRow');
    var rowId = $(this).closest("tr").find("td:first").html();
    var rowId2 = $(this).closest("tr").find("td:nth-child(2)").html();
    $("#RightRecID").val(rowId);
    $("#RightRecID2").val(rowId2);
    $("#RightGridID").val("Grid1");
    $('#Grid1 tr').not(this).removeClass('selectRow');

});

【问题讨论】:

  • 使用 jquery on 连接
  • 直接绑定仅适用于创建绑定时 DOM 中存在的元素。重复的帖子解释了如何使用委托事件绑定来处理未来创建的元素。
  • 从F12可以看到的id("neRowID")只加到ajax生成的表数据中,原来的tr行没有这个id,所以从技术上讲,这个应该可以工作,但根本不工作。
  • 您要么需要使用委托事件(参见上面的链接),要么在创建和附加事件时绑定事件。它不起作用的原因是,当您绑定事件时,DOM 中尚不存在该元素,因此选择器 $('#newRowID') 没有找到任何东西。选择器在运行时只查找当前存在于 DOM 中的元素,并在事后自动处理插入到 DOM 中的元素。

标签: jquery asp.net-mvc asp.net-ajax webgrid


【解决方案1】:

尝试使用 delegate event 而不是本文中提到的 direct eventhttps://jqueryhouse.com/jquery-on-method-the-issue-of-dynamically-added-elements/

你的最后一个函数应该是:

$(document).ready(function () {
    $(document).on('click', '#newRowID', function () {
        alert("test1");
 });

【讨论】:

  • 非常感谢,这是一个简单的解决方案,我明天回到办公室试试这个解决方案,然后告诉你结果。
  • 如果此解决方案有效,则必须添加 id ("newRowID") 才能使其正常工作。所以考虑到默认数据的点击事件($('#Grid1 tr').click(function(){),我需要为ajax添加的表行创建另一个点击事件。基本上,我需要复制$('#Grid1 tr').click(function(){下的代码到ajax生成的动态数据使用的新点击事件。有没有其他解决办法?
  • 如果此解决方案有效,则必须添加 id ("newRowID") 才能使其正常工作。所以考虑到默认数据的点击事件($('#Grid1 tr').click(function(){),我需要为ajax添加的表行创建另一个点击事件。基本上,我需要复制$('#Grid1 tr').click(function(){下的代码到ajax生成的动态数据使用的新点击事件。还有其他解决办法吗?请查看我原帖中新添加的cmets。跨度>
  • 嗨,Alexander,非常感谢您的解决方案,效果很好。
  • 欢迎您。 :)
猜你喜欢
相关资源
最近更新 更多
热门标签