今天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的事件处理中,`event.cancelBubble` 和 `event.stopPropagation()` 都是用来控制事件冒泡的行为,但它们之间存在一些关键的区别。事件冒泡是指事件从最深的节点开始,逐级向上层节点传播事件的过程。...
在IE浏览器的事件模型中,事件的传播遵循一种称为“事件冒泡”的机制。...在现代浏览器中,尽管`event.cancelBubble`仍然可以工作,但为了更好的兼容性和一致性,推荐使用`event.stopPropagation()`。
例如,你可以使用`event.preventDefault()`方法阻止事件的默认行为,或者利用`event.stopPropagation()`防止事件进一步冒泡。这些功能结合`event`对象的属性,可以实现复杂的行为,如检查特定键是否按下,或者根据...
W3C标准的`event.stopPropagation()`被现代浏览器广泛支持,而IE浏览器则使用`event.cancelBubble = true;`。 ```javascript function stopPropagation(e) { var evt = e || window.event; if (evt....
总的来说,理解和正确使用`event.preventDefault()`和`event.stopPropagation()`是JavaScript事件处理中的关键技能,它们能够帮助开发者实现更灵活的交互和控制。在实际项目中,根据具体需求选择合适的方法,确保...
1. 如何阻止事件冒泡 代码如下://非IE if (event && event.stopPropagation) event.stopPropagation(); else//IE window.event.cancelBubble = true; 2.获取控件ID 代码如下:if (document.all) { //IE alert(...
通过上述分析,我们可以看出`preventDefault`和`stopPropagation`这两个方法虽然都可以用于控制事件的处理流程,但是它们的功能侧重点不同: - `preventDefault`主要用于阻止元素的默认行为; - `stopPropagation`...
总的来说,理解和熟练运用`event.stopPropagation()`、`event.cancelBubble`以及`event.preventDefault()`是编写健壮的JavaScript事件处理程序的关键。在编写代码时,应考虑各种浏览器的兼容性问题,以确保代码能在...
if (this.isIe) ev.cancelBubble = true; else ev.stopPropagation(); }; ``` 8. **阻止默认行为**: ```javascript this.preventDefault = function () { var ev = this.getEvent(); if (this.isIe) ev....
除了上述属性,`event`对象还有许多其他属性和方法,例如`event.keyCode`用于获取键盘按键的ASCII码,`event.preventDefault()`用于阻止事件的默认行为,`event.stopPropagation()`用于阻止事件的进一步传播,以及`...
`event.preventDefault()` 和 `event.stopPropagation()` 是常用的两种方法。 3. **计算相对位置**:通过计算鼠标指针与元素左上角之间的距离来确定元素的新位置。 4. **兼容性处理**:由于不同浏览器对于事件处理...
总结来说,通过`event.stopPropagation()`、`event.cancelBubble = true`或者`return false`,你可以阻止事件冒泡,确保`<a>`标签被点击时不会触发`<div>`的`onclick`事件。不过,在选择方法时,要考虑到兼容性和...
总的来说,理解和有效地使用`event.stopPropagation()`和`event.preventDefault()`是JavaScript事件处理的关键部分,它们可以帮助开发者精确控制用户交互和页面行为。在编写交互式网页时,了解如何阻止事件冒泡和...
W3C提供`event.stopPropagation()`方法来实现这一点,而IE则使用`event.cancelBubble = true`。例如: ```javascript function stopHandler(event) { window.event ? window.event.cancelBubble = true : event....
这在很多情况下是有益的,但有时也需要阻止冒泡,如使用`event.cancelBubble = true`来实现。 五、事件委托(Delegation) 事件委托是一种优化技术,通过在共同的父元素上绑定事件监听器,而不是在每个子元素上单独...
理解和熟练使用`event.stopPropagation()`和`event.preventDefault()`是前端开发者必备的技能。它们可以帮助你精确控制事件的处理流程,避免不必要的副作用,同时提供更个性化的用户体验。在实际开发中,结合这两种...
在标准浏览器中,我们可以使用`event.stopPropagation()`;而在IE浏览器中,则需要使用`event.cancelBubble = true`。为了兼容不同浏览器,可以这样写: ```javascript e.stopPropagation ? e.stopPropagation() : ...
event.cancelBubble = true; } } }; var dom_text1 = document.getElementById("text1"); var dom_text2 = document.getElementById("text2"); var dom_text3 = document.getElementById("text3"); ...
总的来说,理解并正确使用`stopPropagation()`、`preventDefault()`、`cancelBubble`和`returnValue`属性是JavaScript事件处理中的关键技巧。这些方法可以帮助开发者更精细地控制事件流,提高用户体验,同时避免因...