javascript - 事件处理顺序

标签 javascript jquery dom-events event-bubbling

Javascript jQuery 事件处理

如果事件(例如“点击”)为父元素绑定(bind)了一个函数,为子 DOM 元素绑定(bind)了另一个处理函数,那么它们中的哪一个被调用? 如果全部调用,它们的调用顺序是什么?

最佳答案

事件在 DOM 树中“向上”冒泡,因此如果您有一个元素及其父元素的处理程序,则子元素处理程序将首先被调用。

如果您为单个 DOM 元素上的事件注册了多个处理程序(例如,为单个按钮注册了多个“单击”处理程序),则这些处理程序将按照它们附加到元素的顺序被调用。

您的处理程序可以做一些事情来改变他们完成后发生的事情:

  • 使用传入的事件参数,调用 event.preventDefault() 以防止发生任何“ native ”操作
  • 调用 event.stopPropagation() 以防止事件在 DOM 树中冒泡
  • 从处理程序返回 false,以停止传播防止默认

请注意,对于某些输入元素(复选框、单选按钮),处理方式有点奇怪。当您的处理程序被调用时,浏览器已经将复选框的“已选中”值设置为与其先前值相反的值。也就是说,如果您有一个未选中的复选框,则“单击”处理程序会注意到“选中”属性在调用时(在用户单击后)将设置为“true”。但是,如果处理程序返回 false,则复选框的值实际上不会因单击而更改,并且会保持未选中状态。所以这就像浏览器在调用处理程序之前执行了一半的“ native ”操作(切换元素的“checked”属性),但是如果处理程序不返回 false(或在事件对象上调用“preventDefault()”)。

关于javascript - 事件处理顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2372798/

相关文章:

javascript - JQuery:如何同步滚动条

jquery - Tinymce 和带分页符的打印

javascript - jQuery 中的闪烁控制对象

javascript - 为什么 Controller 没有绑定(bind)到 Angular 应用程序变量

javascript - d3.js 从一条路径绘制多条并行路径

javascript - 在 Javascript 中捕获 setInterval() 上的鼠标位置

javascript - 使用 Javascript 检索同域上的 HTML

javascript - 在 React.JS 中禁用右键单击

javascript - 无法通过 php mysql 从数组插入特定段

javascript - 尝试使用 Javascript 原型(prototype)删除多个重复代码