javascript的事件机制
2016-11-17 23:41
169 查看
一、事件模型
IE 和 标准DOM的事件模型
IE系:冒泡方式
NETSCAPE系:捕获方式
标准DOM:先捕获再冒泡
冒泡,从触发点向外层、顶层扩散,最后到达document、window,遇到相同注册事件立即触发执行;
捕获则相反,从window、document向里收缩,一直到触发点,遇到相同注册事件立即触发执行;
有代码如下:
页面如下:
在非IE浏览器里,点击里层的s2,依次提示如下,清晰地体现了先捕获、后冒泡的特点:
如果是IE浏览器,则依次提示
二、事件注册
类似这样,
标准DOM
IE
三、阻断事件
标准DOM下:
event.stopPropagation //阻止事件的进一步传播,本节点除外
event.stopImmediatePropagation //立即阻断事件的传播,包括本节点
event.preventDefault() //阻止默认事件的发生。比如说,点击submit控件,提交就是默认事件。
IE下:
window.event.cancelBubble = true; //阻止事件的进一步传播,本节点除外
window.event.returnValue = false;//阻止默认事件的发生
有代码如下:
参考资料:
[解惑]JavaScript事件机制
IE 和 标准DOM的事件模型
IE系:冒泡方式
NETSCAPE系:捕获方式
标准DOM:先捕获再冒泡
冒泡,从触发点向外层、顶层扩散,最后到达document、window,遇到相同注册事件立即触发执行;
捕获则相反,从window、document向里收缩,一直到触发点,遇到相同注册事件立即触发执行;
有代码如下:
<style type="text/css"> div { border: solid 1px red; } #s1 { padding: 10px; border-color: blue; } </style> <div id="s1">s1 <div id="s2">s2</div> </div> <script type="text/javascript"> if(document.attachEvent){//IE浏览器 document.getElementById("s1").attachEvent("onclick",function(e){ alert("s1冒泡模式"); }); document.getElementById("s2").attachEvent("onclick",function(e){ alert("s2冒泡模式"); }); } else{ s1.addEventListener("click", function() { alert("s1捕获模式"); }, true); s2.addEventListener("click", function() { alert("s2捕获模式"); }, true); s1.addEventListener("click", function() { alert("s1冒泡模式"); }, false); s2.addEventListener("click", function() { alert("s2冒泡模式"); }, false); } </script>
页面如下:
在非IE浏览器里,点击里层的s2,依次提示如下,清晰地体现了先捕获、后冒泡的特点:
s1捕获模式 s2捕获模式 s2冒泡模式 s1冒泡模式
如果是IE浏览器,则依次提示
s2冒泡模式 s1冒泡模式
二、事件注册
类似这样,
标准DOM
s1.addEventListener("click", function() { alert("捕获模式"); }, true); s1.addEventListener("click", function() { alert("冒泡模式"); }, false);
IE
document.getElementById("s1").attachEvent("onclick",function(e){ alert("IE下注册事件"); });
三、阻断事件
标准DOM下:
event.stopPropagation //阻止事件的进一步传播,本节点除外
event.stopImmediatePropagation //立即阻断事件的传播,包括本节点
event.preventDefault() //阻止默认事件的发生。比如说,点击submit控件,提交就是默认事件。
IE下:
window.event.cancelBubble = true; //阻止事件的进一步传播,本节点除外
window.event.returnValue = false;//阻止默认事件的发生
有代码如下:
<style type="text/css"> div { border: solid 1px red; } #s1 { padding: 10px; border-color: blue; } </style> <form id="f1"> <div id="s1">s1 <div id="s2">s2</div> <div><input type="submit" id="b1" value="submit" /></div> </div> </form> <script type="text/javascript"> if(document.attachEvent){//IE浏览器 document.getElementById("s1").attachEvent("onclick",function(e){ alert("s1事件"); }); document.getElementById("s2").attachEvent("onclick",function(e){ alert("s2事件"); }); document.getElementById("b1").attachEvent("onclick",function(e){ alert("b1点击事件1"); window.event.cancelBubble = true;//使s1事件无效;b1点击事件2不受影响,仍然执行(S2事件则与本次点击无关,始终不会被触发) window.event.returnValue = false;//使f1提交事件无效 }); document.getElementById("b1").attachEvent("onclick",function(e){ alert("b1点击事件2"); }); document.getElementById("f1").attachEvent("onsubmit",function(e){ alert("提交..."); }); } else{ s1.addEventListener("click", function() { alert("s1事件"); }, false); s2.addEventListener("click", function() { alert("s2事件"); }, false); b1.addEventListener("click", function(evt) { alert("b1点击事件1"); evt.stopPropagation();//使s1事件无效;b1点击事件2不受影响,仍然执行(S2事件则与本次点击无关,始终不会被触发) evt.stopImmediatePropagation();//使b1点击事件2,s1事件无效; evt.preventDefault();//使f1提交事件无效 }, false); b1.addEventListener("click", function(evt) { alert("b1点击事件2"); }, false); f1.addEventListener("submit", function() { alert("提交..."); }, false); } </script>
参考资料:
[解惑]JavaScript事件机制
相关文章推荐
- 利用Javascript实现一套自定义事件机制
- javascript事件捕获机制,dom tree
- JavaScript运行机制之事件循环(Event Loop)详解
- 解析Javascript事件冒泡机制
- 解析Javascript事件冒泡机制
- day15 CSS 定位 JavaScript 基本语法、基于对象编程、事件处理机制
- JavaScript——事件机制
- 解析Javascript事件冒泡机制
- JavaScript事件冒泡机制和阻止事件冒泡及默认事件
- 【移动端兼容问题研究】javascript事件机制详解(涉及移动兼容)
- javascript之-深入事件机制
- Javascript 事件冒泡机制详细介绍
- JavaScript 事件机制理解
- javascript打造跨浏览器事件处理机制[Blue-Dream出品]
- JavaScript的事件机制
- JavaScript的事件机制详解
- 解析Javascript事件冒泡机制
- 韩顺平 javascript教学视频_学习笔记23_js事件驱动机制深入理解_js常用事件_js版计算器
- JavaScript事件传播(冒泡机制)
- javascript事件机制底层实现原理