解决/阻止 div层内的div层点击事件冒泡触发的小方法

本文通过一个具体的案例,探讨了如何使用stopPropagation方法有效避免事件冒泡,从而精确控制DOM元素上的点击事件触发。

起因

       有天,同事问我,有一个div层'out',内含有一个div层'in'。如下:


       两个层都绑定了点击事件,但是点击in层的时候,同时也会触发out层的点击事件。但是他并不希望触发out的点击事件,只希望触发in层的点击事件,问我怎么处理。页面代码:

<div style="width: 400px;height: 400px;background-color: #678678;font:3em bold;" id="outDiv">
    out
    <div style="width: 200px;height: 200px;margin: 50px;background-color: #eaceac;font:1em bold;" id="inDiv">in</div>
</div>


权宜之计

       当时正在忙,也没细想解决方法。当然,以前也没写过类似的代码,就只好用了一个很笨的办法,用了一个简单的全局变量,来记录是点击的in层还是out层,然后就解决了这个问题了。代码如下:

            var clickDiv = 'out';
            inDiv.addEventListener('click',function(e){
                clickDiv = 'in';
                alert('in');
            },false);
            outDiv.addEventListener('click',function(e){
                if(clickDiv == 'out')
                    alert('out');
                clickDiv = 'out'
            },false);
而且当时就随手写,根本没用addEventLinstener来绑事件,点击事件直接写在div的onclick=""里面,外面定义了两个点击function。


解决

       当然,当时就知道,这个解决方案很有问题。但是当时问题有点急,就随手这样解决了,看起来也没出现什么bug。只是代码非常的不优雅。直到今天,读到了《基于MVC的JavaScript Web富应用开发》中的第二章,关于如何取消事件冒泡的方法。才算是比较靠谱的解决了这个问题,代码如下:

            inDiv.addEventListener('click',function(e){
                alert('in');
                e.stopPropagation();//终止事件冒泡
            },false);
            outDiv.addEventListener('click',function(e){
                alert('out');
            },false);



       这也算是因为认真读书解决了一个实际遇到的问题吧。写个博客记录一下。  


附件

       示例代码:点击打开链接

<think>好的,我需要解决用户的问题:如何在JavaScript中阻止div内部元素的点击事件冒泡和默认行为。首先,我要回忆一下事件处理的相关知识。用户提到了阻止冒泡和默认行为,所以应该分别处理这两个方面。 根据引用[2]和[4],阻止冒泡可以使用e.stopPropagation(),而IE低版本需要设置e.cancelBubble = true。对于默认行为,引用[1]和[3]提到e.preventDefault(),但要注意return false只能在传统事件绑定中使用,且可能有兼容性问题。 用户的需求是阻止div内部元素的点击事件,所以需要给这些内部元素绑定事件处理函数。比如,假设内部元素是按钮或链接,点击时可能会触发默认行为(如跳转),这时候需要同时阻止冒泡和默认行为。 我应该分步骤说明,首先如何阻止冒泡,然后阻止默认行为,最后结合两者。还要注意兼容性处理,比如统一事件对象和判断方法是否存在。此外,建议使用addEventListener来绑定事件,因为传统方式(onclick)不够灵活,并且return false可能有局限性,如引用[3]所述。 需要确保代码示例正确,比如获取元素的方式,使用addEventListener,并在处理函数中调用stopPropagation和preventDefault。同时,提醒用户如果元素是链接,不仅要阻止默认行为,还要确保事件处理正确,比如在表单提交时可能需要其他处理。 最后,检查是否有遗漏,比如是否需要阻止div的事件,或者是否只是处理子元素。用户的问题明确是阻止内部元素的事件,所以应该针对子元素进行处理,而不是父div。可能还需要提到事件委托的情况,但用户这里可能不需要,但可以作为一个注意事项提到。</think>在JavaScript中阻止div内部元素的点击事件冒泡和默认行为,需分三步操作: ### 一、阻止事件冒泡实现方法 1. 通过事件对象的`stopPropagation()`方法 2. 兼容IE低版本使用`cancelBubble = true` 核心代码示例: ```javascript document.querySelector('.child-element').addEventListener('click', function(e) { e = e || window.event; // 阻止事件冒泡 if (e.stopPropagation) { e.stopPropagation(); } else { e.cancelBubble = true; // IE<9兼容处理[^4] } }); ``` ### 二、阻止默认行为实现方法 1. 使用`preventDefault()`方法 2. 注意`<a>`标签和表单元素的特殊处理 核心代码示例: ```javascript document.querySelector('a').addEventListener('click', function(e) { e.preventDefault(); // 阻止链接跳转[^1] }); ``` ### 三、完整解决方案(结合冒泡阻止+默认行为阻止) ```javascript const childElements = document.querySelectorAll('.inner-element'); childElements.forEach(el => { el.addEventListener('click', function(e) { e = e || window.event; // 阻止冒泡 if (e.stopPropagation) { e.stopPropagation(); } else { e.cancelBubble = true; } // 阻止默认行为 if (e.preventDefault) { e.preventDefault(); } else { e.returnValue = false; // IE兼容处理[^3] } console.log('已执行自定义点击逻辑'); }); }); ``` ### 注意事项 1. 推荐使用`addEventListener`而非`onclick`属性绑定事件[^3] 2. 表单元素需特别注意:`<input type="submit">`的默认行为是表单提交 3. 对动态创建的元素需要使用事件委托时,应在父级判断事件源
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值