【发布时间】:2011-11-25 00:28:23
【问题描述】:
假设 FORM 包含 INPUT,有以下监听器:
javascript
function formFirst(e) { ... }
function formLast(e) { ... }
function inputFirst(e) { ... }
function inputLast(e) { ... }
function middle(e) { ... }
document.getElementById('form').addEventListener('change',formFirst,true);
document.getElementById('form').addEventListener('change',formLast,false);
document.getElementById('input').addEventListener('change',inputFirst,true);
document.getElementById('input').addEventListener('change',inputLast,false);
所需的发射顺序
formFirst() // normal - outer element, useCapture = true
inputFirst() // normal - triggering element, declared first
middle() // -- how to do this?
inputLast() // normal - triggering element, declared second
formLast() // normal - outer element, useCapture = false
问题的性质和尝试的解决方案
在 FORM 级别拥有自己的代码 formFirst、formLast 和 middle,但无法访问 INPUT 代码 inputFirst 和 inputLast - 尽管可以在 INPUT 上添加自己的侦听器。
尝试 1 修改 formFirst() 以创建并调度一个新的 change Event(将在 formFirst 中被忽略),该 inputFirst() 将调用 inputFirst(),但无法停止传播以防止inputLast() 随后被调用。
尝试2将middle添加为INPUT的侦听器,但不能保证两个相同类型和相同useCapture的侦听器的触发顺序。
尝试 2 的前提不正确 - 触发顺序由目标元素内的声明顺序决定。
这里是规则
-
非目标元素触发
useCapture=false,从最外层元素开始,朝着目标元素前进a) 如果多个
useCapture=true触发同一元素,则声明顺序。 -
在目标元素处,声明顺序,不管
useCapture -
使用
useCapture=false触发非目标元素,从最里面的元素开始,远离目标元素a) 如果多个
useCapture=false触发同一个元素,则声明顺序。
【问题讨论】:
标签: javascript dom javascript-events