在JavaScript中,如果在HTML元素及其祖先上声明了事件触发器,则首先触发
In JavaScript, if an event trigger is declared on an HTML element and its ancestor, which fires first?
有两个onchange
触发器:一个在INPUT上,另一个来自包含INPUT的表单。
funcForm
还是funcInput
先着火?这个行为是定义和一致的吗?
如果
e.stopPropagation()
在第一个射击触发器上发出,第二个射击吗?
应该首先触发输入的处理程序,然后如果事件冒泡,则应该在DOM层次结构中冒泡。来自DOM Events规范:
事件被分派到它的目标EventTarget,并且在那里发现的任何事件侦听器都被触发。冒泡事件将触发任何额外的事件侦听器,通过遵循EventTarget的父链向上发现
[…]
任何事件处理程序都可以选择通过调用Event
接口的stopPropagation
方法来阻止进一步的事件传播。如果任何EventListener
调用此方法,则当前EventTarget
上的所有其他EventListeners
将被触发,但冒泡将在该级别停止。为了防止进一步冒泡,只需要调用一次stopPropagation
。
第二段适用于stopPropagation
,并说如果input
上的侦听器调用e.stopPropagation()
,则事件不应该到达<form>
。然而,<input>
上的任何剩余侦听器都将看到更改事件,stopPropagation
只是阻止事件在树中冒泡,直到stopPropagation
被调用的级别。
此外,更改事件会冒泡:
当控件失去输入焦点并且自获得焦点以来其值已被修改时,将发生更改事件。此事件对INPUT、SELECT和TEXTAREA有效。元素。
- 泡沫:是的
这取决于事件处理程序是为捕获阶段还是冒泡阶段设置的。addEventListener
函数有第三个参数useCapture
,默认值为false。如果useCapture
为true,那么祖先元素在沿着DOM树向下移动的过程中捕获事件,并首先触发其处理程序。如果useCapture
为false(默认值),则事件沿着DOM树传播到事件目标,子元素首先触发其处理程序,然后事件气泡向上显示到祖先。
所以你现在的方式是:funcInput
将首先触发;行为是明确和一致的;和e.stopPropagation()
将阻止funcForm
和任何其他事件处理程序触发。
查看http://www.quirksmode.org/js/events_order.html和https://developer.mozilla.org/en/DOM/element.addEventListener获取更多信息
- jQuery触发器事件在一个循环中多次出现
- 每次只在第一个上单击事件触发器
- jquery on触发器按键事件两次
- 2个Analytics帐户中的Google Analytics事件触发器跟踪
- JavaScript 触发器事件在 Android 上选择文本
- 更改多个选择选项后的jQuery触发器事件
- HTML中的触发器事件<选择>框
- 如何检测jQuery触发器事件完成
- 测试具有触发器事件的函数
- 无法从触发器事件中获取参数值
- 触发器事件,当自动完成完成密码输入时
- 如何解除绑定从外部js文件添加的触发器事件
- UpdatePanel触发器,如何设置触发器事件__doPostBack
- 有没有办法在控制台中自动输出所有backbone.js触发器/事件?
- Ajax生成的元素上的触发器事件
- 绑定到另一个文件中的触发器事件
- 选择JavaScript中的框触发器事件
- DOM加载后定义的触发器事件-JIRA打开新的问题模式
- PHP生成的表上的触发器事件
- 选择在jQuery中不起作用的触发器事件