我对JS事件传播的理解是,事件首先“捕获”DOM树,然后“气泡”备份,从而触发处理程序。
<html>
<body>
<div id="textbox">
nothing yet
</div>
</body>
<script>
// Gets incremented by "update" event
var val = 0;
// Event starts here
textbox = document.getElementById("textbox");
textbox.addEventListener("update", function(e) {
textbox.innerHTML = val;
}, false);
// Should bubble here
body = document.getElementsByTagName("body")[0];
body.addEventListener("update", function(e) {
val++;
}, false);
function update() {
var e = new Event("update");
textbox.dispatchEvent(e);
}
setInterval(update, 10);
</script>
</html>在我的代码在这里中,正文中有一个div "textbox“。我认为发送到文本框的更新事件应该会冒泡到正文,但它不会。计数器永远不会更新。
如果我将主体事件侦听器的UseCapture参数设置为true,则计数器将更新。
为什么捕获工作,但不冒泡?
发布于 2015-08-04 21:46:45
为了达到你想要的效果(现在什么都不显示,那么0,1,2,.)您需要遵循前面的几个答案,再加上textbox上的集合捕获。(否则,您将看到任何显示,1,2,.)。首先,您需要将事件的冒泡设置为true -如下所示:
function update() {
var e = new Event("update",{bubbles:true});
textbox.dispatchEvent(e);
}然后需要捕获事件(设置为true) -如下所示:
// Event starts here
textbox = document.getElementById("textbox");
textbox.addEventListener("update", function(e) {
textbox.innerHTML = val;
}, true);所以一切看起来都是这样的:
// Event starts here
textbox = document.getElementById("textbox");
textbox.addEventListener("update", function(e) {
textbox.innerHTML = val;
}, true);
// Should bubble here
body = document.getElementsByTagName("body")[0];
body.addEventListener("update", function(e) {
val++;
console.log(val)
}, false);
function update() {
var e = new Event("update",{bubbles:true});
textbox.dispatchEvent(e);
}
setInterval(update, 1000);发布于 2015-08-04 20:57:54
发布于 2015-08-04 20:54:01
如果你使用旧的(不幸的是被废弃的)方式,它会产生气泡。请参阅https://jsfiddle.net/py9vyr7h/1/
function update() {
var event = document.createEvent('CustomEvent');
// Second param says to bubble the event
event.initEvent('update', true, true);
textbox.dispatchEvent(event);
}https://stackoverflow.com/questions/31818984
复制相似问题