为您解惑:JS事件流之由浅入深剖析......
来源:互联网 发布:项目投资价值数据分析报告 编辑:程序博客网 时间:2024/05/22 12:52
事件流描述的是从页面中接收事件的顺序,也就是说当一个事件产生时,这个事件的传播过程,就是事件流。
1.IE的事件流:
IE中的事件流叫事件冒泡即:事件开始时由最具体的元素接收,然后逐级向上传播到较为不具体的节点(文档)。对于html来说,就是当一个元素产生了一个事件,它会把这个事件传递给它的父元素,父元素接收到了之后,还要继续传递给它的上一级元素,就这样一直传播到document对象。
2.标准浏览器的事件捕获流:
捕获事件即:事件从document对象开始,然后事件一级一级往下传,直到最具体的元素为止,刚好和冒泡事件相反。
3.事件处理程序:
(1)HTML事件处理程序(即事件写在HTML文档页面中)。
(2)DOM0级事件处理程序。
(3)DOM2级事件处理程序。
DOM2级事件定义两个方法:用于处理指定和删除事件处理程序的操作即:addEventListner()和removeEventListner()。他们都要接受三个参数:要处理的事件名、事件处理函数以及boolean值(true表示捕获事件流,false表示冒泡事件流)。而IE事件处理程序的函数为:attachEvent()和detachEvent()。他们只接受两个参数:要处理的事件名、事件处理函数。
DOM0级与DOM2级的简单实例如下:
a.使用DOM0级,在向同一事件(比如onclick)添加处理函数时,只能添加一个,如果添加了两个,后面的会覆盖前面的:
element.onclick = clickHandler1;
element.onclick = clickHandler2; //clickHandler2会覆盖clickHandler1.
b.而使用DOM2级,可以向同一事件添加多个处理函数:
element.addEventListener('clcik',clickHandler1,false);
element.addEventListener('clcik',clickHandler2,false);
注:现在的浏览器默认是采用的是事件冒泡;在DOM0级方法绑定事件只能是事件冒泡,不能设置;在DOM2级你可以设置是用事件冒泡还是事件捕获。
下面重点讨论一下DOM0级事件处理程序:
a. 使用DOM0级方法指定的事件处理程序被认为是元素的方法,因此是在元素的作用域中运行,换句话说,程序中的this引用的是当前元素。
<span style="font-size:14px;"><script type="text/javascript"> var div_id = document.getElementById("div_id"); div_id.onclick = function(){ alert(this.id); //div_id };</script></span>可以在事件处理程序中通过this访问元素的任何属性和方法,以这种方式(即DOM0级)添加的事件处理程序会在事件流中的冒泡阶段被处理。
b.可以删除通过DOM0级方法指定的事件处理程序,只要将事件处理程序属性的值设为null即可。
<span style="font-size:14px;"></span><pre name="code" class="javascript"><span style="font-size:14px;"><script type="text/javascript"></span>btn.onclick = null; //删除事件处理程序
</script>
c.在DOM0级事件处理程序中取消冒泡事件的封装函数。
<span style="font-size:14px;">function stopPro(e) { //e指事件处理函数中的event参数。 if (e && e.stopPropagation) { //W3C取消冒泡事件 e.stopPropagation(); } else { //IE取消冒泡事件 window.event.cancelBubble = true; } };</span>
d.事件冒泡的例子如下:
<span style="font-size:14px;"><!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>事件冒泡</title> <style type="text/css"> #child{ background: red; width:50px; height:50px; } #father{ width:100px; height:100px; background:green; } #grandparent{ width:150px; height:150px; background:black; margin:100px auto 0; } </style></head><body> <div id='grandparent'> <div id='father'> <div id='child'></div> </div> </div></body><script type="text/javascript"> var grandparent = document.getElementById("grandparent"); var parent = document.getElementById("father"); var child = document.getElementById('child'); var html = document.getElementsByTagName("html")[0]; var body = document.body; child.onclick = function () { console.log("我是儿子"); } parent.onclick = function () { console.log("我是父亲"); } grandparent.onclick = function () { console.log("我是爷爷"); } window.onclick = function () { console.log("我是window"); } document.onclick = function () { console.log("我是document"); } html.onclick = function () { console.log("我是html"); } body.onclick = function () { console.log("我是body"); }</script></html></span>
下面是事件流的相关教程链接:
(1)http://www.cnblogs.com/blackwood/archive/2013/03/14/2959195.html (一)
(2)http://www.cnblogs.com/blackwood/archive/2013/03/15/2961006.html (二)
(3)http://www.runoob.com/jsref/dom-obj-event.html(HTML DOM事件教程)
PS:猿猿们有什么意见和建议可以留言给我呦!
- 为您解惑:JS事件流之由浅入深剖析......
- 为您解惑:window下的onload事件。
- 为您解惑:JS模块与命名空间的介绍........
- 为您解惑:JS中宽度、高度的用法区别.........
- 由浅入深剖析.htaccess
- 由浅入深剖析.htaccess
- 由浅入深剖析.htaccess
- 由浅入深剖析.htaccess
- 由浅入深全面剖析ThreadLocal
- 为您解惑:html5Web存储........
- 为您解惑:js中继承的几种用法总结(apply,call,prototype).........
- node.js解惑 之 .app.use
- JS事件之事件流机制
- JS事件之DOM事件流
- js之阻止事件流
- js随笔之事件流
- Vue.js 由浅入深
- 为您解惑:jQuery中$.getJSON( )的使用方法简介之获取JSON格式的数据.........
- C语言中单向链表的相关操作
- Codeforces Round #377 Exams(二分)
- c语言基础,长期更新
- PC监听手机数据包
- java中的多线程同步与异步
- 为您解惑:JS事件流之由浅入深剖析......
- C#: 执行批处理文件(*.bat)的方法
- ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
- java中重载与重写的区别
- Codeforces Round #246 (Div. 2)-C. Prime Swaps
- oracle 用户 角色 权限管理 新手村攻略
- 二叉搜索树的后序遍历序列
- Android开发中的APP内存泄漏检测
- 小技巧、小经验(4)