js的stopPropagation()、cancelBubble、preventDefault()、return false的分析

本文详细探讨了JavaScript中的事件冒泡现象,通过示例解释了如何阻止事件冒泡,包括使用event.stopPropagation()、event.cancelBubble=true、event.preventDefault()以及return false。同时,分析了这些方法在阻止事件传播和浏览器默认行为上的区别和应用场景,帮助开发者更好地理解和掌握事件处理机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

事件冒泡,举个列子:

<li>
    <a href='http://www.baidu.com'>点击a</a>
</li>
<script>
    $('li').click(function () {
        alert('点击了li');
    });
    $('a').click(function () {
        alert('点击了a');
    });
</script>

当你点击a的时候,会先弹出‘点击了a’,再弹出‘点击了li’,最后跳转到百度。简单理解就是先执行子元素的事件,再执行父元素的事件,跟事件捕获相反。

有些时候,我们不希望发生父元素的事件,只发生子元素的事件,这时候就需要阻止事件冒泡。分析一下事件冒泡,顺便分析一下阻止浏览器默认行为的一些方法:

1、event.stopPropagation();(阻止冒泡)

2、event.cancelBubble = true;(阻止冒泡)

3、event.preventDefault();(阻止浏览器默认行为)

4、return false;(有很多行为)

一、event.stopPropagation();

<script>
    $('li').click(function () {
        alert('点击了li');
    });
    $('a').click(function (event) {
        alert('点击了a');
        event.stopPropagation();
    });
</script>

 完美阻止了li元素的冒泡,并且不会影响a的事件。效果是:先弹出‘点击了a’,然后跳转百度

注:之前看到说是不兼容IE8及一下,亲测IE6以上没问题,如有错,望指出。

二、event.cancelBubble = true;

<script>
    $('li').click(function () {
        alert('点击了li');
    });
    $('a').click(function () {
        alert('点击了a');
        console.log(event);
        event.cancelBubble = true;
    });
</script>

 使用cancelBubble需要注意:

event事件是窗口的MouseEvent,此处console.log打印的是:MouseEvent {isTrusted: true, screenX: 55, screenY: 90, clientX: 55, clientY: 29…}

。效果跟上面的是一样:先弹出‘点击了a’,然后跳转百度。刚刚测的时候,好像兼容性也还好。

三、event.preventDefault();

<script>
    $('li').click(function () {
        alert('点击了li');
    });
    $('a').click(function (event) {
        alert('点击了a');
        event.preventDefault();
    });
</script>

执行后的效果:先弹出‘点击了a’,再弹出‘点击了li’,但是,不执行跳转!不执行跳转!不执行跳转!

其实,default英文意思是默认的,想想不难理解,页面中,除了执行监听事件还会触发浏览器默认动作; 执行监听事件在前, 触发浏览器默认动作在后。

preventDefault并不是阻止事件冒泡,只是阻止浏览器的默认动作。而stopPropagation跟cancelBubble只是阻止事件冒泡,并没有阻止

浏览器的默认动作。当我们希望阻止事件冒泡的同时,也阻止浏览器的默认动作时,就可以2者都一起使用,如下代码:

<script>
    $('li').click(function () {
        alert('点击了li');
    });
    $('a').click(function (event) {
        alert('点击了a');
        console.log(event);
        event.stopPropagation();
        event.preventDefault();
    });
</script>

效果是:只弹出‘点击了a’,并不跳转百度链接,也不弹出‘点击了li’。

四、最后的一个return false;

<script>
    $('li').click(function () {
        alert('点击了li');
    });
    $('a').click(function () {
        alert('点击了a');
        return false;
    });
</script>

执行效果:只弹出‘点击了a’,并不跳转百度链接,也不弹出‘点击了li’。跟(stopPropagation+preventDefault)是一个效果。

退出执行, return false 之后的所有触发事件和动作都不会被执行. 有时候 return false 可以用来替代stopPropagation() 和 

preventDefault(), 比如上面的例子。

值得注意的一点:有人认为 return false = stopPropagation() + preventDefault(),其实是错的。 return false 不但阻止事件,

还可以返回对象, 跳出循环等... 方便地一刀切而不够灵活, 滥用易出错。

贴一下本博客的html的代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件冒泡</title>
</head>
<body>
    <ul>
        <li>
            <a href='#'>点击a</a>
        </li>
    </ul>
    <script src="jquery-1.11.3.min.js"></script>
    <script>
        $('li').click(function () {
            alert('点击了li');
        });
        $('a').click(function (event) {
            alert('点击了a');
            console.log(event);
            event.stopPropagation();
            // event.cancelBubble = true;
            event.preventDefault();
            // return false;
        });
    </script>
</body>
</html>

补充:谢谢博友指出,对于return false;我说明的比较少,其实return false并不是事件冒泡,本文讲的是跟事件冒泡有关的内容,return false在某种情况下也能实现。

因为return false不但阻止了事件,也阻止了浏览器的默认行为,就像一个终止符,也常常用它来阻止提交表单或者继续执行下面的代码,并且只在当前函数下

有用,return false执行了以下行为:

1、执行event.preventDefault();  阻止浏览器的默认行为;

2、event.stopPropagation();  阻止冒泡行为;

3、停止回调函数执行并立即返回。

写文章之前,我看到这样一句话:“cancelBubble用于ie的阻止冒泡事件,event.stopPropagation()用于firefox和chrome等其他浏览器。”。我不

知道现在还是不是这样子,测试的时候兼容是好的,所以就没有说明这一点。当然,为了保险起见,博友帮我封了一个函数,感谢!文中不对之处还望指出,多多学习。

//阻止冒泡事件
function stopBubble(e){
    if(e && e.stopPropagation){
        // 非IE浏览器
        e.stopPropagation();
    }else{ 
        //IE浏览器
        window.event.cancelBubble=true;
    }
}

 同理,如果想阻止浏览器的默认事件

//阻止浏览器默认行为
function stopDefault(e){ 
    //标准浏览器
    if(e && e.preventDefault){ 
        e.preventDefault(); 
    } 
    //个别IE
    else{ 
        window.event.returnValue=fale;
        return false;
    } 
} 

来源

网站:博客园

作者:ZQ是水鱼

链接:https://www.cnblogs.com/wuzhiquan/p/5380800.html

### 方法 `preventDefault` 和 `stopPropagation` 的区别 #### 阻止默认行为:`preventDefault` 当调用 `event.preventDefault()` 时,会取消当前事件的默认操作。如果这个事件不再有任何其他侦听器被触发,则浏览器不会采取任何进一步行动[^1]。 例如,在链接点击的情况下,默认情况下浏览器将会导航至指定 URL;但是通过调用此函数可以防止页面跳转: ```javascript document.querySelector('a').addEventListener('click', function(event){ event.preventDefault(); }); ``` #### 阻止事件传播:`stopPropagation` 另一方面,`event.stopPropagation()` 负责停止事件向 DOM 树上层元素冒泡的过程。这意味着一旦某个特定级别的处理程序响应了该事件,它就不会再传递给更高层次的祖先节点来触发其上的相应处理器。 考虑如下 HTML 结构及其对应的 JavaScript 实现方式: ```html <div id="outer"> Outer div <button id="inner">Click me</button> </div> <script type="text/javascript"> var outerDiv = document.getElementById('outer'); var innerButton = document.getElementById('inner'); // 添加 click 事件监听器到外部 div 上 outerDiv.addEventListener('click', function(){ console.log('Outer div clicked.'); }); // 同样为按钮添加 click 事件监听器 innerButton.addEventListener('click', function(event){ console.log('Inner button clicked.'); // 停止事件继续向上冒泡 event.stopPropagation(); }); </script> ``` 在这个例子中,单击内部按钮只会打印 "Inner button clicked." 到控制台,而不会引起外部分割区域内的消息输出,这是因为我们已经阻止了事件沿DOM树上升的行为[^3]。 --- 对于 Internet Explorer 浏览器的支持,可以通过检测是否存在这些方法并提供相应的替代方案以确保跨平台兼容性: ```javascript if (event.stopPropagation) { event.stopPropagation(); // W3C 模型下的标准做法 } else { event.cancelBubble = true; // IE 特有的属性设置 } if (event.preventDefault) { event.preventDefault(); // W3C 模型下预防默认动作的标准写法 } else { event.returnValue = false; // 对应于旧版IE环境里的实现手段 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值