Javascript 为什么e.stopPropagation()不起作用?

Javascript 为什么e.stopPropagation()不起作用?,javascript,event-bubbling,stoppropagation,Javascript,Event Bubbling,Stoppropagation,我正在读Aaron Gustafson写的一本名为《自适应网页设计》的书,如果我有一段我不懂的javascript代码的话。在研究过程中,我发现了返回false和e.default之间的区别。我现在也了解了一点JavaScript的冒泡效果,并了解到要停止冒泡,可以使用e.stopPropagation()(至少在none ie浏览器中) 我在摆弄小提琴,但我无法使它工作。我认为这可能与冒泡的作用方式有关(从根到元素再到根?) 这是小提琴:(固定链接) 编辑: 我复制粘贴了错误的链接!现在修好了

我正在读Aaron Gustafson写的一本名为《自适应网页设计》的书,如果我有一段我不懂的javascript代码的话。在研究过程中,我发现了返回false和e.default之间的区别。我现在也了解了一点JavaScript的冒泡效果,并了解到要停止冒泡,可以使用e.stopPropagation()(至少在none ie浏览器中)

我在摆弄小提琴,但我无法使它工作。我认为这可能与冒泡的作用方式有关(从根到元素再到根?)

这是小提琴:(固定链接) 编辑: 我复制粘贴了错误的链接!现在修好了


所以我想看到的是,当您单击锚定时,在div上使用的onclick不会被执行(这不是一个实际案例,只是一个研究案例!)

事件从单击的元素一直到文档对象

div上的任何事件处理程序都将在主体上的事件处理程序之前触发(因为主体是它在DOM中的祖先)


当事件到达身体时,阻止它作用于div已经太晚了。

好的,我发现我的第一把小提琴是错的。我找到了另一个可行的示例,并展示了stopPropagation()的工作原理:

var divs=document.getElementsByTagName('div');

对于(var i=0;i,如果您希望取消HTML中从子级到父级冒泡的事件,请使用下面的代码

event.cancelBubble = true;

通过使用这种方式,您可以停止从子元素到父元素的事件进一步向上冒泡。

您链接到的代码与问题中的代码不相似。它们都不包含div。那么这是否意味着如果不触发div的onclick,就无法单击链接?如果是这样,那么我不知道为什么以及何时停止冒泡()函数。将事件处理程序附加到链接-确定。但将事件处理程序附加到正文。
var divs = document.getElementsByTagName('div');

for(var i=0; i<divs.length; i++) {
  divs[i].onclick = function( e ) {
    e = e || window.event;
    var target = e.target || e.srcElement;

    //e.stopPropagation ? e.stopPropagation() : ( e.cancelBubble = true );
    if ('bubbles' in e) { // all browsers except IE before version 9
        if (e.bubbles) {
            e.stopPropagation();
            alert("The propagation of the event is stopped.");
        } else {
            alert("The event cannot propagate up the DOM hierarchy.");
        }
    } else { // Internet Explorer before version 9
        // always cancel bubbling
        e.cancelBubble = true;
        alert("The propagation of the event is stopped.");
    }

    this.style.backgroundColor = 'yellow';

    alert("target = " + target.className + ", this=" + this.className );

    this.style.backgroundColor = '';
  }
}
event.cancelBubble = true;