`

event.cancelBubble 和 event.stopPropagation()

阅读更多
    今天fix bug过程中,发现了一个难题,最后问了ada,得到了解决方案。
    问题:现在有个Ext grid,单击会触发单击事件,popup一个page。现在要implement一个new feture,就是该grid里面有个column要改成link,点该link会download一个attachment.
         问题来了,当我点击该link的时候,除了会download文件外,还会触发该grid的单击事件,popup一个page出来(事实上我不想popup page).
    最后解决方法:给该link加上onclick事件,方法是donotPopup,代码如下:
function donotPopup(event) {
    event.cancelBubble = true;
    if (event) {
        event.stopPropagation();
    }
}

event.cancelBubble = true;和event.stopPropagation();
其实只要其中一个都可以达到我的需求。

event.cancelBubble使触发在子对象上的事件不传递给父对象,也就是可以在点击一个单元格里的图片的时候不触发该单元格的onclick事件,
禁止事件冒泡

发现这两个东西挺神奇,以前没听讲过还有这东西。。上网查了下event.cancelBubble和event.stopPropagation(),下面是找到的一些资料。。

----------------------------------------------------------------------------------------------------------------------------------------
                           event.cancelBubble的理解
    由于HTML中的对象都是层次结构,比如一个Table包含了多个TR,一个TR包含了多个TD
Bubble就是一个事件可以从子节点向父节点传递,比如鼠标点击了一个TD,当前的event.srcElement就是这个TD,但是这种冒泡机制使你可以从TR或者Table处截获这个点击事件,但是如果你event.cancelBubble,则就不能上传事件。

例子:

<html>
    <body>
    <table border="1" width="26%" id="tableA" onclick="alert('点击了tableA')">
        <tr onclick="tableA_rowA_click()">
            <td width="106">一般</td>
        </tr>
        <tr onclick="tableA_rowB_click()">
            <td width="106">阻止消息上传</td>
        </tr>
    </table>
    </body>
</html>


<script language="javascript">
    function tableA_rowA_click(){
        alert('点击了tableA的rowA');
    }

    function tableA_rowB_click(){
        alert('点击了tableA的rowB');
        event.cancelBubble=true;
    }
</script>



event.cancelBubble=true; 取消事件冒泡,在 IE 的事件机制中,触发事件会从子元素向父元素逐级上传,就是说,如果子元素触发了单击事件,那么也会触发父元素的单击事件;event.cancelBubble=true;可以停止事件继续上传补充一点,Ie的事件传递是从下到上的:

事件来源对象->上级对象->上上级对象->.....->body->document->window

NS的事件传递是从上到下:

window->document->body->....->事件来源对象实例源码如下:
<html> 
    <head> 
	    <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 
	    <title>event.cancelBubble</title> 
	    <style> 
		<!-- 
		  * {font:menu} 
		--> 
	</style> 
    </head> 
    <body> 
        <span onclick=alert("你好")>点我 <span>再点我</span></span><br><br> 
        <span onclick=alert("你好")>点我 <span onclick=event.cancelBubble=true;>再点我</span></span> 
    </body> 
</html> 

实例2:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh" xml:lang="zh">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<meta name="developer" content="Realazy" />
<title>Bubble in JavaScript DOM--JavaScript 的事件冒泡 demo </title>
<style type="text/css" media="screen">
    div * {display:block; margin:4px; padding:4px; border:1px solid white;}
    textarea {width:20em; height:2em;}
</style>
<script type="text/javascript">
    //<![CDATA[
    function init(){
        var log = document.getElementsByTagName('textarea')[0];
        var all = document.getElementsByTagName('div')[0].getElementsByTagName('*');
        for (var i = 0, n = all.length; i < n; ++i){
             all[i].onmouseover = function(e){
              this.style.border = '1px solid red';
              log.value = '鼠标现在进入的是: ' + this.nodeName;
             };
            all[i].onmouseout = function(e){
                this.style.border = '1px solid white';
            };
        }

        var all2 = document.getElementsByTagName('div')[1].getElementsByTagName('*');
        for (var i = 0, n = all2.length; i < n; ++i){
            all2[i].onmouseover = function(e){
                this.style.border = '1px solid red';
                if (e){ //停止事件冒泡
                   e.stopPropagation();
                }
                  else{
                   window.event.cancelBubble = true;
                   }
                  log.value = '鼠标现在进入的是: ' + this.nodeName;
             };

            all2[i].onmouseout = function(e){
                this.style.border = '1px solid white';
            };
        }
    }
    window.onload = init;
      //]]>
</script>
</head>
<body>
    <h1>Bubble in JavaScript DOM</h1>
    <p>DOM树的结构是:</p>
    <pre><code>
    UL
        - LI
           - A
         - SPAN
    </code></pre>
    <div>
    <ul>
        <li><a href="#"><span>Bubbllllllllllllllle</span></a></li>
        <li><a href="#"><span>Bubbllllllllllllllle</span></a></li>
    </ul>
    </div>
    <textarea></textarea>
    <p>鼠标进入UL的任何一个子元素,如果不停止冒泡,我们从UL到SPAN都定义了鼠标悬停(<code>mouseover</code>)事件,这个事件会上升了UL,从而从鼠标所进入的元素到UL元素都会有红色的边。</p>
    <div>
    <ul>
        <li><a href="#"><span>Bubbllllllllllllllle</span></a></li>
        <li><a href="#"><span>Bubbllllllllllllllle</span></a></li>
    </ul>
    </div>
    <p>如果停止冒泡,事件不会上升,我们就可以获取精确的鼠标进入元素。</p>
</body>
</html>

关于enent.preventDefault() 和 event.stopPropagation()
event.preventDefault()
该方法将通知 Web 浏览器不要执行与事件关联的默认动作(如果存在这样的动作)。例如,如果 type 属性是 "submit",在事件传播的任意阶段可以调用任意的事件句柄,通过调用该方法,可以阻止提交表单。注意,如果 Event 对象的 cancelable 属性是 fasle,那么就没有默认动作,或者不能阻止默认动作。无论哪种情况,调用该方法都没有作用。

event.stopPropagation()
该方法将停止事件的传播,阻止它被分派到其他 Document 节点。在事件传播的任何阶段都可以调用它。注意,虽然该方法不能阻止同一个 Document 节点上的其他事件句柄被调用,但是它可以阻止把事件分派到其他节点。

event是DOM的事件方法,所以不是单独使用,比如指定DOM

由于只看到你的代码片段,无法准确判断全部的问题,你试试下面的方法:

event.preventDefault();
改成
e.preventDefault();
分享到:
评论

相关推荐

    关于event.cancelBubble和event.stopPropagation()的区别介绍

    在JavaScript的事件处理中,`event.cancelBubble` 和 `event.stopPropagation()` 都是用来控制事件冒泡的行为,但它们之间存在一些关键的区别。事件冒泡是指事件从最深的节点开始,逐级向上层节点传播事件的过程。...

    IE的事件传递-event.cancelBubble示例介绍

    在IE浏览器的事件模型中,事件的传播遵循一种称为“事件冒泡”的机制。...在现代浏览器中,尽管`event.cancelBubble`仍然可以工作,但为了更好的兼容性和一致性,推荐使用`event.stopPropagation()`。

    [JS]详尽解析window.event对象

    例如,你可以使用`event.preventDefault()`方法阻止事件的默认行为,或者利用`event.stopPropagation()`防止事件进一步冒泡。这些功能结合`event`对象的属性,可以实现复杂的行为,如检查特定键是否按下,或者根据...

    js阻止冒泡及jquery阻止事件冒泡示例介绍.docx

    W3C标准的`event.stopPropagation()`被现代浏览器广泛支持,而IE浏览器则使用`event.cancelBubble = true;`。 ```javascript function stopPropagation(e) { var evt = e || window.event; if (evt....

    js阻止默认浏览器行为与冒泡行为的实现代码.docx

    总的来说,理解和正确使用`event.preventDefault()`和`event.stopPropagation()`是JavaScript事件处理中的关键技能,它们能够帮助开发者实现更灵活的交互和控制。在实际项目中,根据具体需求选择合适的方法,确保...

    Javascript 阻止javascript事件冒泡,获取控件ID值

    1. 如何阻止事件冒泡 代码如下://非IE if (event && event.stopPropagation) event.stopPropagation(); else//IE window.event.cancelBubble = true; 2.获取控件ID 代码如下:if (document.all) { //IE alert&#40;...

    js(冒泡)中的preventDefault和stopPropagation.doc

    通过上述分析,我们可以看出`preventDefault`和`stopPropagation`这两个方法虽然都可以用于控制事件的处理流程,但是它们的功能侧重点不同: - `preventDefault`主要用于阻止元素的默认行为; - `stopPropagation`...

    JavaScript阻止事件冒泡示例分享

    总的来说,理解和熟练运用`event.stopPropagation()`、`event.cancelBubble`以及`event.preventDefault()`是编写健壮的JavaScript事件处理程序的关键。在编写代码时,应考虑各种浏览器的兼容性问题,以确保代码能在...

    封装自己的js工具-Event.txt

    if (this.isIe) ev.cancelBubble = true; else ev.stopPropagation(); }; ``` 8. **阻止默认行为**: ```javascript this.preventDefault = function () { var ev = this.getEvent(); if (this.isIe) ev....

    js中window窗体对象文档

    除了上述属性,`event`对象还有许多其他属性和方法,例如`event.keyCode`用于获取键盘按键的ASCII码,`event.preventDefault()`用于阻止事件的默认行为,`event.stopPropagation()`用于阻止事件的进一步传播,以及`...

    javascript 拖动

    `event.preventDefault()` 和 `event.stopPropagation()` 是常用的两种方法。 3. **计算相对位置**:通过计算鼠标指针与元素左上角之间的距离来确定元素的新位置。 4. **兼容性处理**:由于不同浏览器对于事件处理...

    javascript 不让鼠标事件触发

    总结来说,通过`event.stopPropagation()`、`event.cancelBubble = true`或者`return false`,你可以阻止事件冒泡,确保`&lt;a&gt;`标签被点击时不会触发`&lt;div&gt;`的`onclick`事件。不过,在选择方法时,要考虑到兼容性和...

    javascript阻止事件冒泡和浏览器的默认行为

    总的来说,理解和有效地使用`event.stopPropagation()`和`event.preventDefault()`是JavaScript事件处理的关键部分,它们可以帮助开发者精确控制用户交互和页面行为。在编写交互式网页时,了解如何阻止事件冒泡和...

    浅谈javascript事件取消和阻止冒泡

    W3C提供`event.stopPropagation()`方法来实现这一点,而IE则使用`event.cancelBubble = true`。例如: ```javascript function stopHandler(event) { window.event ? window.event.cancelBubble = true : event....

    09JavaScript事件总结.docx

    这在很多情况下是有益的,但有时也需要阻止冒泡,如使用`event.cancelBubble = true`来实现。 五、事件委托(Delegation) 事件委托是一种优化技术,通过在共同的父元素上绑定事件监听器,而不是在每个子元素上单独...

    浅谈js停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)

    理解和熟练使用`event.stopPropagation()`和`event.preventDefault()`是前端开发者必备的技能。它们可以帮助你精确控制事件的处理流程,避免不必要的副作用,同时提供更个性化的用户体验。在实际开发中,结合这两种...

    【JavaScript源代码】Javascript实现单选框效果.docx

    在标准浏览器中,我们可以使用`event.stopPropagation()`;而在IE浏览器中,则需要使用`event.cancelBubble = true`。为了兼容不同浏览器,可以这样写: ```javascript e.stopPropagation ? e.stopPropagation() : ...

    javascript自动切换焦点控制效果完整实例.docx

    event.cancelBubble = true; } } }; var dom_text1 = document.getElementById("text1"); var dom_text2 = document.getElementById("text2"); var dom_text3 = document.getElementById("text3"); ...

    js停止冒泡和阻止浏览器默认行为的简单方法

    总的来说,理解并正确使用`stopPropagation()`、`preventDefault()`、`cancelBubble`和`returnValue`属性是JavaScript事件处理中的关键技巧。这些方法可以帮助开发者更精细地控制事件流,提高用户体验,同时避免因...

Global site tag (gtag.js) - Google Analytics