We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
要了解事件冒泡,我们就得把它跟事件捕获来一起交代!
<div id="d1"> <p id="p1"> <span id="s1"> Click Here </span> </p> </div>
加入我给如上HTML的三级标签上都加上Click事件:
//注意这里的最后一个参数,默认也是false document.getElementById('d1').addEventListener('click',function(e){ console.log('d1'); },false); document.getElementById('p1').addEventListener('click',function(e){ console.log('p1'); },false); document.getElementById('s1').addEventListener('click',function(e){ console.log('s1'); },false);
当点击页面上的 Click Here 的文字时,控制台会依次打印:
Click Here
s1 p1 d1
也就是这3个事件的触发是由内层标签开始朝外依次进行的。
如果这时候修改一下事件绑定的方式,如下:
//最后一个参数修改为true document.getElementById('d1').addEventListener('click',function(e){ console.log('d1'); },true); document.getElementById('p1').addEventListener('click',function(e){ console.log('p1'); },true); document.getElementById('s1').addEventListener('click',function(e){ console.log('s1'); },true);
再次点击页面上的 Click Here 的文字时,控制台会依次打印:
d1 p1 s1
addEventListener 的参数说明:https://developer.mozilla.org/zh-CN/docs/Web/API/EventTarget/addEventListener
addEventListener
如文档中所说的,其实就是 useCapture 这个参数:true 表示事件捕获, false 表示事件冒泡,默认是冒泡
useCapture
true
false
如下图是对 事件捕获 和 事件冒泡 的进一步说明
事件捕获
事件冒泡
先说明下,IE旧的浏览器对于事件的定义不同(<=IE8),所以当你使用旧浏览器的时候,务必考虑兼容性!
function stopPropagation(e){ if(e && e.stopPropagation){//支持W3C的stopPropagation()方法 e.stopPropagation(); return; }; if(window.event){//<=IE8,取消事件冒泡 window.event.cancelBubble = true; }; }
看一些栗子:
<a>
href
<input type="submit">
<form>
function stopDefault(e){ if(e && e.preventDefault){//支持W3C的preventDefault()方法 e.preventDefault(); return; }; if(window.event){//<=IE8,阻止默认行为 window.event.returnValue = true; }; }
e.stopPropagation
e.preventDefault
window.event.cancelBubble = true
window.event.returnValue = true
使用jQuery的事件方法,直接使用 return false 既可以阻止冒泡也可以阻止默认行为
return false
$(ele).click(function(){ //... //阻止冒泡和默认行为 return false; });
(全文完)
The text was updated successfully, but these errors were encountered:
sunmaobin
No branches or pull requests
JS解惑-如何阻止事件冒泡和取消默认行为
什么是事件冒泡?
要了解事件冒泡,我们就得把它跟事件捕获来一起交代!
一组栗子
加入我给如上HTML的三级标签上都加上Click事件:
当点击页面上的
Click Here
的文字时,控制台会依次打印:也就是这3个事件的触发是由内层标签开始朝外依次进行的。
如果这时候修改一下事件绑定的方式,如下:
再次点击页面上的
Click Here
的文字时,控制台会依次打印:原因解释
addEventListener
的参数说明:https://developer.mozilla.org/zh-CN/docs/Web/API/EventTarget/addEventListener如文档中所说的,其实就是
useCapture
这个参数:true
表示事件捕获,false
表示事件冒泡,默认是冒泡如下图是对
事件捕获
和事件冒泡
的进一步说明如何阻止事件冒泡
什么是默认行为?
看一些栗子:
<a>
标签,我们点击以后默认会跳转到href
属性配置的地址去,这就是<a>
的默认行为;<input type="submit">
如果放在<form>
标签中,点击后默认会提交该<form>
表单,这就是<input type="submit">
的默认行为;如何阻止默认行为?
总结
支持W3C标准
e.stopPropagation
e.preventDefault
IE8及以下非W3C标准
window.event.cancelBubble = true
window.event.returnValue = true
补充
使用jQuery的事件方法,直接使用
return false
既可以阻止冒泡也可以阻止默认行为(全文完)
The text was updated successfully, but these errors were encountered: