JavaScript和JQuery中的事件\委托链\事件冒泡\事件捕获,兼容所有浏览器

有做过北大青鸟培训讲师经验的我,如今在一家公司做技术部经理的职位,发现有很多程序员的基本功相当糟糕,在组织企业内部培训时讲解了一些案例,总结了一些经典代码,希望对自己和有需要的人提供一些帮助吧:

JavaScript版本:

DOM0事件不支持委托链

 1 <!DOCTYPE html>
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 5     <title>DOM0事件不支持委托链</title>
 6     <script language="javascript" type="text/javascript">
 7         window.onload = function () {
 8             //DOM0事件不支持委托链
 9             document.getElementById("child").onclick = function () {
10                 output("abc");
11             };
12             document.getElementById("child").onclick = function () {
13                 output("123");
14             };
15             document.getElementById("child").onclick = function () {
16                 output("def");
17             };
18             document.getElementById("child").onclick = function () {
19                 output("456");
20             };
21         };
22
23         function output(text) {
24             document.getElementById("content").innerHTML += text + "<br/>";
25         }
26     </script>
27 </head>
28 <body id="body">
29     <div id="parent">
30         <div id="child">
31             点击这里
32         </div>
33     </div>
34     <div id="content">
35     </div>
36 </body>
37 </html>

event01

DOM2事件支持委托链

 1 <!DOCTYPE html>
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 5     <title>DOM2事件支持委托链</title>
 6     <script language="javascript" type="text/javascript">
 7         window.onload = function () {
 8             //DOM2事件支持委托链
 9             if (document.all) {
10                 document.getElementById("child").attachEvent("onclick", function () {
11                     output("IE:abc");
12                 });
13                 document.getElementById("child").attachEvent("onclick", function () {
14                     output("IE:123");
15                 });
16                 document.getElementById("child").attachEvent("onclick", function () {
17                     output("IE:def");
18                 });
19                 document.getElementById("child").attachEvent("onclick", function () {
20                     output("IE:456");
21                 });
22             } else {
23                 document.getElementById("child").addEventListener("click", function () {
24                     output("Other:abc");
25                 });
26                 document.getElementById("child").addEventListener("click", function () {
27                     output("Other:123");
28                 });
29                 document.getElementById("child").addEventListener("click", function () {
30                     output("Other:def");
31                 });
32                 document.getElementById("child").addEventListener("click", function () {
33                     output("Other:456");
34                 });
35             }
36         };
37
38         function output(text) {
39             document.getElementById("content").innerHTML += "注意IE和Other的顺序:" + text + "<br/>";
40         }
41     </script>
42 </head>
43 <body id="body">
44     <div id="parent">
45         <div id="child">
46             点击这里
47         </div>
48     </div>
49     <div id="content">
50     </div>
51 </body>
52 </html>

event02

采用DOM0方式添加所有html事件,支持取消事件冒泡

 1 <!DOCTYPE html>
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 5     <title>采用DOM0方式添加所有html事件,支持取消事件冒泡</title>
 6     <script src="js/jquery-1.8.2.js"></script>
 7     <script language="javascript" type="text/javascript">
 8         window.onload = function () {
 9             //给所有DOM对象添加所有html的click事件,采用DOM0方式
10             var tags = document.getElementsByTagName("*");
11             for (var i = 0 ; i < tags.length ; i++) {
12                 var tag = tags[i];
13                 tag.onclick = onEvent;
14             }
15         };
16         function onEvent(event) {
17             //window.alert(event);//IE不支持
18             //return;
19
20             //event = event ? event : window.event;
21             //window.alert(event);//都支持
22             //return;
23
24             //window.alert(event.target);//IE不支持
25             //return;
26
27             //event = event ? event : window.event;
28             //target = event.target ? event.target : event.srcElement;
29             //window.alert(target);//都支持
30             //return;
31
32             //event = event ? event : window.event;
33             //target = event.target ? event.target : event.srcElement;
34             //output("事件源:" + target.id + "," + target.tagName + ",事件对象:" + this.id);//DOM0会产生冒泡
35             //return;
36
37             event = event ? event : window.event;
38             target = event.target ? event.target : event.srcElement;
39             output("事件源:" + target.id + "," + target.tagName + ",事件对象:" + this.id);//DOM0会产生冒泡
40
41             //支持取消事件冒泡
42             if (event.cancelable) {
43                 event.stopPropagation();//其他浏览器取消事件冒泡
44             } else {
45                 event.cancelBubble = true;//IE取消事件冒泡
46             }
47         };
48         function output(text) {
49             document.getElementById("content").innerHTML += "" + text + "<br/>";
50         }
51     </script>
52 </head>
53 <body id="body">
54     <div id="parent">
55         <div id="child">
56             点击这里
57         </div>
58     </div>
59     <div id="content">
60     </div>
61 </body>
62 </html>

event03

采用DOM2方式添加所有html事件,支持取消事件冒泡

 1 <!DOCTYPE html>
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 5     <title>采用DOM2方式添加所有html事件,支持取消事件冒泡</title>
 6     <script language="javascript" type="text/javascript">
 7         window.onload = function () {
 8             //给所有DOM对象添加所有html的click事件,采用DOM2方式
 9             var tags = document.getElementsByTagName("*");
10             for (var i = 0 ; i < tags.length ; i++) {
11                 (function () { //增加闭包,解决IE浏览器onEvent方法定义里面的this都指向了每一个不同的事件对象,而不是都指向了同一个content事件对象,
12                     var tag = tags[i];
13                     //DOM2方式
14                     if (document.all) {
15                         //IE浏览器
16                         //tag.attachEvent("onclick", onEvent);//onEvent里面的this指向window
17                         //tag.attachEvent("onclick", function () {
18                         //    onEvent.call(tag);//onEvent方法定义里面的this都指向了content,因为没有使用闭包
19                         //});
20                         tag.attachEvent("onclick", function () {
21                             onEvent.call(tag);//使用闭包的方式解决this的问题,在var = tags[i];上面增加闭包的使用
22                         });
23                     } else {
24                         tag.addEventListener("click", onMaoPaoEvent);//事件冒泡,false可以不写
25                         //tag.addEventListener("click", onMaoPaoEvent, false);//事件冒泡
26                         tag.addEventListener("click", onBuHuoEvent, true);//事件捕获
27                     }
28                 })();
29             }
30         };
31         function onEvent(event) {
32             event = event ? event : window.event;
33             target = event.target ? event.target : event.srcElement;
34             output("事件源:" + target.id + "," + target.tagName + ",事件对象:" + this.id);//DOM0会产生冒泡
35             return;
36             //同样支持取消事件冒泡
37             if (event.cancelable) {
38                 event.stopPropagation();//其他浏览器取消事件冒泡
39             } else {
40                 event.cancelBubble = true;//IE取消事件冒泡
41             }
42         };
43         function onMaoPaoEvent(event) {
44             event = event ? event : window.event;
45             target = event.target ? event.target : event.srcElement;
46             output("事件冒泡-->事件源:" + target.id + "," + target.tagName + ",事件对象:" + this.id);//DOM0会产生冒泡
47             return;
48             //同样支持取消事件冒泡
49             if (event.cancelable) {
50                 event.stopPropagation();//其他浏览器取消事件冒泡
51             } else {
52                 event.cancelBubble = true;//IE取消事件冒泡
53             }
54         };
55         function onBuHuoEvent(event) {
56             event = event ? event : window.event;
57             target = event.target ? event.target : event.srcElement;
58             output("事件捕获-->事件源:" + target.id + "," + target.tagName + ",事件对象:" + this.id);//DOM0会产生捕获
59             return;
60             //同样支持取消事件捕获
61             if (event.cancelable) {
62                 event.stopPropagation();//其他浏览器取消事件冒泡
63             } else {
64                 event.cancelBubble = true;//IE取消事件冒泡
65             }
66         };
67         function output(text) {
68             document.getElementById("content").innerHTML += "" + text + "<br/>";
69         }
70     </script>
71 </head>
72 <body id="body">
73     <div id="parent">
74         <div id="child">
75             点击这里
76         </div>
77     </div>
78     <div id="content">
79     </div>
80 </body>
81 </html>

event04

JQuery版本:

DOM0事件不支持委托链

 1 <!DOCTYPE html>
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 5     <title>DOM0事件不支持委托链</title>
 6     <script src="/js/jquery-1.8.2.js"></script>
 7     <script language="javascript" type="text/javascript">
 8         $(function () {
 9             //DOM0事件不支持委托链
10             $("#child")[0].onclick = function (event) {
11                 output("abc");
12             };
13             $("#child")[0].onclick = function (event) {
14                 output("123");
15             };
16             $("#child")[0].onclick = function (event) {
17                 output("def");
18             };
19             $("#child")[0].onclick = function (event) {
20                 output("456");
21             };
22         });
23         function output(text) {
24             $("#content").append(text + "<br/>");
25         }
26     </script>
27 </head>
28 <body id="body">
29     <div id="parent">
30         <div id="child">
31             点击这里
32         </div>
33     </div>
34     <div id="content">
35     </div>
36 </body>
37 </html>

jquery_event01

DOM2事件支持委托链

 1 <!DOCTYPE html>
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 5     <title>DOM2事件支持委托链</title>
 6     <script src="/js/jquery-1.8.2.js"></script>
 7     <script language="javascript" type="text/javascript">
 8         $(function () {
 9             //DOM2事件支持委托链
10             $("#child").bind("click", function (event) {
11                 output("abc");
12             });
13             $("#child").bind("click", function (event) {
14                 output("123");
15             });
16             $("#child").bind("click",  function (event) {
17                 output("def");
18             });
19             $("#child").bind("click",  function (event) {
20                 output("456");
21             });
22             //第二种方式也支持委托链
23             //$("#child").click(function (event) {
24             //    output("abc");
25             //});
26             //$("#child").click(function (event) {
27             //    output("123");
28             //});
29             //$("#child").click(function (event) {
30             //    output("def");
31             //});
32             //$("#child").click(function (event) {
33             //    output("456");
34             //});
35         });
36         function output(text) {
37             $("#content").append(text + "<br/>");
38         }
39     </script>
40 </head>
41 <body id="body">
42     <div id="parent">
43         <div id="child">
44             点击这里
45         </div>
46     </div>
47     <div id="content">
48     </div>
49 </body>
50 </html>

jquery_event02

采用DOM0方式添加所有html事件,支持取消事件冒泡

 1 <!DOCTYPE html>
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 5     <title>采用DOM0方式添加所有html事件,支持取消事件冒泡</title>
 6     <script src="/js/jquery-1.8.2.js"></script>
 7     <script language="javascript" type="text/javascript">
 8         $(function () {
 9             $("*").each(function (index, item) {
10                 item.onclick = function (event) {
11                     event = event ? event : window.event;
12                     target = event.target ? event.target : event.srcElement;
13                     output("事件源:" + target.id + "," + target.tagName + ",事件对象:" + this.id);//DOM0会产生冒泡
14
15                     //支持取消事件冒泡
16                     if (event.cancelable) {
17                         event.stopPropagation();//其他浏览器取消事件冒泡
18                     } else {
19                         event.cancelBubble = true;//IE取消事件冒泡
20                     }
21                 };
22             });
23         });
24         function output(text) {
25             $("#content").append(text + "<br/>");
26         }
27     </script>
28 </head>
29 <body id="body">
30     <div id="parent">
31         <div id="child">
32             点击这里
33         </div>
34     </div>
35     <div id="content">
36     </div>
37 </body>
38 </html>

jquery_event03

采用DOM2方式添加所有html事件,支持取消事件冒泡

 1 <!DOCTYPE html>
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 5     <title>采用DOM2方式添加所有html事件,支持取消事件冒泡</title>
 6     <script src="/js/jquery-1.8.2.js"></script>
 7     <script language="javascript" type="text/javascript">
 8         $(function () {
 9             $("*").each(function (index, item) {
10                 $(item).bind("click", function (event) {
11                     output("事件源:" + event.target.id + "," + event.target.tagName + ",事件对象:" + event.currentTarget.id);//DOM2会产生冒泡
12                     //支持取消事件冒泡
13                     event.stopPropagation();
14                 });
15                 //第二种方式也支持
16                 //$(item).click(function (event) {
17                 //    output("事件源:" + event.target.id + "," + event.target.tagName + ",事件对象:" + event.currentTarget.id);//DOM2会产生冒泡
18                 //    //支持取消事件冒泡
19                 //    //event.stopPropagation();
20                 //});
21             });
22         });
23         function output(text) {
24             $("#content").append(text + "<br/>");
25         }
26     </script>
27 </head>
28 <body id="body">
29     <div id="parent">
30         <div id="child">
31             点击这里
32         </div>
33     </div>
34     <div id="content">
35     </div>
36 </body>
37 </html>

jquery_event04

时间: 2024-10-03 08:54:42

JavaScript和JQuery中的事件\委托链\事件冒泡\事件捕获,兼容所有浏览器的相关文章

javascript 与 jquery 中的函数调用的区别

标签:例如<input id="btn_show" type="button" onclick="show()" /> <script type="text/javascript"> $(function(){ function show(){ -- } }) function show(){ -- } </script> 注意, 此时button的点击事件不会调用jquery中的show(

jQuery中animate动画第二次点击事件没反应

jQuery中animate动画第二次点击事件没反应 用animate做点击翻页动画时发现第二次点击事件动画没反应,而第一次点击有动画效果,代码如下: 复制代码 代码如下: $(".page").stop().animate({top:“-300px”}, 800, 'easeInOutExpo'); 第二次点击事件动画没反应的原因:top是page元素顶部相与其父元素顶部的距离,第一次点击后,page元素顶部已经移动到距其父元素顶部 -300px的位置,第二次点击时的并不是page在

事件委托与阻止冒泡

简单说下事件委托与阻止冒泡 html: <ul class="clearfix" data-type="cityPick"> <li class="active_sort_opts" data-id="0">全部</li> <li data-id="88">纽约</li> <li data-id="119">洛杉矶&

JQ事件委托导致点击事件多次执行问题

起因:最近写网页其中一个模块使用tab切换~每一个tab里都有点击按钮提交事件,刚开始点击提交只执行一次,但是只要我tab切换页面又切换回来该页面,再点击该按钮,我切换了多少次页面,代码提交也会提交很多次: 原因:后来找了一下原因,得知是因为JQ事件委托导致点击事件多次执行的(事件委托是指:利用事件冒泡,指定一个事件处理程序来管理某一类型的所有事件),虽然我页面切换了,但是事件问题还在,所以才会点击一次执行多次: 解决方法:使用off()函数移除之前添加的事件处理程序,就能解决该问题. eg:

理解JavaScript和jQuery中的位置与尺寸

Part 1 JavaScript中的位置和尺寸 一.元素的位置 1. offsetLeft:offsetTop(只读) 相对于offsetParent边框左上角的坐标. 什么是offsetParent? 某元素的offsetParent就是离该元素最近的定位父元素,如果没有定位父元素,那么offsetParent就是body. 2.scrollLeft:scrollTop(可设置) 由于滚动而被遮挡的内容区域左上方部分的宽高. 仅仅对页面和设置了overflow的元素有效,(因为只有它们的内容

对事件委托绑定click的事件的解绑

大家都知道解绑事件的jquery写法,很简单: $("xxx").unbind("click"); 然后对于事件委托式的事件绑定,亲测,这种解绑方法是无效的, $(".sideNav>ul").on("click", function (e) {     alert("aaa"+$(e.tagert).index()); } 即使做判断让一部分带有某个class的li标签的ul解绑click,依然无效

关于事件委托和时间冒泡(以及apply和call的事项)

搜索事件委托和事件冒泡,网上一大堆乱七八糟的解释,当然意思都对,没毛病. but,真的无聊. 事件冒泡:事件会从点击的元素开始依次向上流出,直到html,遇见事件监听则执行. 事件委托:原因--父元素下有若干不定子元素需要添加相同监听事件.处理方法--利用事件冒泡性质给父元素加监听事件,再用e.target获取被点击的子元素,即事件源. 然后说到事件委托就要谈到apply和call方法了. apply方法,网上也有一大把解释,老样子,我还是喜欢简单点的. 1.所谓apply就是改变当前对象的th

JavaScript事件:事件处理模型(冒泡、捕获)

(一)事件处理模型---事件冒泡.捕获 (1)事件冒泡 24 <body> 25 <div class="warpper"> 26 <div class="content"> 27 <div class="box"> 28 29 </div> 30 </div> 31 </div> 32 <script type="text/javascript&

div嵌套点击事件问题解决方法-阻止冒泡事件

<html> <body> <li onclick="javascript:alert(1);">11111 <li onclick="javascript:alert(2);">  22222 <li id="li3" onclick="javascript:alert(3);">    33333 </li> </li> </li&g