$(document).on()和$(element)之间有什么区别.on()

plo*_*uzz 9 jquery

我知道jquery .on()的使用和目的,因为我使用它.

但是我想知道这个脚本中$(document).on()vs $(element).on()之间的区别是什么:

<html>
...
<body>
...
  <table id="table-user">
    <thead>...</thead>
    <tbody>
      AJAX DYNAMIC CONTENT
    </tbody>
  </table>
....
<script>
  $(document).on('click','.btn-edit',function(){
    go_edit();
  });

  $('#table-user').on('click','.btn-edit',function(){
    go_edit();
  });

</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

是什么表现不同或他们之间的其他东西?

Yea*_*der 11

@Mukesh已经回答了主要的区别.我会尝试再增加一件事.

当您在html文档中的元素(如div按钮)上单击(或任何其他事件)时,该单击事件将传播到该元素的父元素.所以如果你有这样的结构:

<div>
    <table>
        <tr>
            <td>
                <button>Click Me</button>
            </td>
        </tr>
    </table>
</dvi>
Run Code Online (Sandbox Code Playgroud)

然后单击按钮,该单击将传播到td,然后传播到tr,然后传播到表,最后传播到文档本身.

现在假设您已经在文档上注册了一个click事件($ document.on('click',...))以及按钮($(button.on('click',...))),两者都做了一些不同的动作.然后,如果单击该按钮,将执行相应的按钮操作,并且还将执行$(文档)的相应操作.

要防止按钮单击传播到文档本身,您需要对按钮单击处理程序执行操作(如stopPropagation等)


Muk*_*Ram 9

$(document).on('click','.btn-edit',function()
Run Code Online (Sandbox Code Playgroud)

这会将单击事件绑定到文档及其中的所有子元素.此方法称为委托事件处理.

$('#table-user').on('click','.btn-edit',function()
Run Code Online (Sandbox Code Playgroud)

将click事件直接绑定到#table-user.直接在元素上捕获事件.

  • @plonknimbuzz:如果可能,最好在更高的节点上处理事件。就像如果每行都有一个带有按钮的表格,那么与其在每个按钮上注册一个事件,不如向表格本身注册该事件并编写代码以在表格事件处理程序上执行所需的操作。 (2认同)

Moo*_*oze 5

如果 DOM 中不存在 Node 该怎么办?

考虑这样的情况:您要监听其事件的节点在 DOM 中尚不存在。然后$(document).on('event', 'child-selector', callback);事实证明非常有帮助。