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();

你可能感兴趣的:(JavaScript,html,浏览器,IE,ext)