提问者:小点点

在通过Ajax/jQuery添加的追加表行上检测单击事件


我需要检测动态添加到表中的行上的单击事件(使用jQuery)。 表的id为MyTable

对于在设计时创建/硬编码到本地页的表行来说,这是没有问题的; 我知道我可以使用$('#MyTable TR')。单击(。。。);

但是,我的用例是通过ajax加载新的表行并将其追加到表中。 在这种情况下,不调用click事件处理程序。

过去,我使用jQuery的.live()函数来处理动态加载的元素,但我看到现在已经不推荐使用.on()。 这将是好的,除了它是不工作的我在这种情况下。

下面是一些演示代码和一个显示该问题的jsfiddle。 请注意,单击“Static Row”(静态行)会显示一个警告框,这是预期的,但动态添加的行不会出现这种情况:

<!DOCTYPE html>
<body>
  <h1>Dynamic table event test</h1>
  <table id="myTable">
  <tr><td>Static row</td></tr>
  </table>
  <button onclick="addTableRow()">Add row</button>
  <script>
    function addTableRow() {
        $('#myTable').append('<tr><td>Dynamic row</td></tr>');
    }
    $('#myTable tr').on('click', function() {
      alert('Row clicked');
    });
  </script>
</body>
</html> 

共3个答案

匿名用户

更改

$('#myTable tr').click(...);

$('#myTable').on('click', 'tr', function() { ... });

第一种方法只为与选择器匹配的元素创建eventhandelrs,并将其附加到加载期间存在的元素。 第二个将处理程序附加到父表。

匿名用户

请尝试以下操作:

$('#myTable').on('click', 'tr', function() {
      alert('something');
});

您需要使用inside选择器将事件附加到动态创建的元素。 因为此方法将事件附加到已存在的父级。

匿名用户

$('#myTable').on('click', 'tr', function() {
  alert('Row clicked');
});

由于在加载DOM-tree之后添加了一个新元素(在您的示例中为tr),因此该元素实际上被认为是不存在的(作为DOM-element),因此事件不会被触发。

然而,当您将事件绑定到父元素(在向DOM添加新元素/外星人元素之前和之后都存在)并以其子元素为目标(即tr)时,将实现所需的操作。