首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript事件,捕获工作冒泡不会

Javascript事件,捕获工作冒泡不会
EN

Stack Overflow用户
提问于 2015-08-04 20:44:47
回答 3查看 1.2K关注 0票数 2

我对JS事件传播的理解是,事件首先“捕获”DOM树,然后“气泡”备份,从而触发处理程序。

代码语言:javascript
复制
<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,则计数器将更新。

为什么捕获工作,但不冒泡?

EN

回答 3

Stack Overflow用户

发布于 2015-08-04 21:46:45

为了达到你想要的效果(现在什么都不显示,那么0,1,2,.)您需要遵循前面的几个答案,再加上textbox上的集合捕获。(否则,您将看到任何显示,1,2,.)。首先,您需要将事件的冒泡设置为true -如下所示:

代码语言:javascript
复制
function update() {
    var e = new Event("update",{bubbles:true});
    textbox.dispatchEvent(e);
}

然后需要捕获事件(设置为true) -如下所示:

代码语言:javascript
复制
// Event starts here
textbox = document.getElementById("textbox");
textbox.addEventListener("update", function(e) {
    textbox.innerHTML = val;
}, true);

所以一切看起来都是这样的:

代码语言:javascript
复制
// 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);
票数 1
EN

Stack Overflow用户

发布于 2015-08-04 20:57:54

您需要将{ bubbles: true }作为new Event( ... )的第二个参数传递给new Event( ... ),这样事件才能像关于MDN的文献那样冒泡,因为false

更新的jsfiddle示例

票数 0
EN

Stack Overflow用户

发布于 2015-08-04 20:54:01

如果你使用旧的(不幸的是被废弃的)方式,它会产生气泡。请参阅https://jsfiddle.net/py9vyr7h/1/

代码语言:javascript
复制
function update() {
    var event = document.createEvent('CustomEvent');
    // Second param says to bubble the event
    event.initEvent('update', true, true);
    textbox.dispatchEvent(event);
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31818984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档