[JS]笔记14之事件委托

-->什么是事件委托
-->事件委托原理
-->事件委托优点
-->事件源 / 目标源

一、什么是事件委托

通俗的讲,onclick,onmouseover,onmouseout等这些就是事件

委托,就是这个事件本来应该加在某些元素上的,而你却加到其他元素上来完成这个事件。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>事件委托1</title>
<style>

</style>
</head>
<body>
    <div id="parent">
        <h3>我是h3标签</h3>
        <p>我是p标签</p>
    </div>
<script>
    var parent=document.getElementById(‘parent‘);
    var h3=parent.getElementsByTagName(‘h3‘)[0];
    document.onclick=function(ev){//点击事件委托给document
        var e=ev||window.event;
        console.log(e);
        if (e.target.nodeName==‘H3‘) {//设置为h3的点击事件
            alert(‘h3‘);
        }
    }
</script>
</body>
</html>

二、事件委托原理

利用事件传播(冒泡)机制,就可以实现事件委托 。

具体来说,事件委托就是事件目标自身不处理事件,而是把处理任务委托给其父元素或者祖先元素,甚至根元素(document)来完成。

三、事件委托优点

1、提高性能、效率高
2、新添加的元素也会有之前的事件(给未来元素添加事件)
3、代码量少

可以给未来元素添加事件:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>事件委托优2-target</title>
<style>
*{margin:0;padding:0;list-style: none;}
#list{overflow: hidden;}
#box li{width:100px;height:100px;line-height:100px;font-size:20px;color:#fff;text-align:center;float: left;margin:10px;background: #ccc;}
</style>
</head>
<body>
<div id="box">
    <button id="btn">创建</button>
    <ul id="list1">
        <li>111</li>
        <li>222</li>
        <li>333</li>
        <li>444</li>
    </ul>
    <ul id="list2">
        <li>111</li>
        <li>222</li>
        <li>333</li>
        <li>444</li>
    </ul>
</div>
<script>
    var btn=document.getElementById(‘btn‘);
    var box=document.getElementById(‘box‘);
    var list1=document.getElementById(‘list1‘);
    var lis=box.children;
    btn.onclick=function(){
        var oli=document.createElement(‘li‘);
        oli.innerHTML=‘新建li‘;
        list1.appendChild(oli);
    }
    box.onclick=function(ev){
        var e=ev||window.event;
        var target=e.target||e.srcElement;//获取事件源兼容写法
        if (e.target.nodeName==‘LI‘&&e.target.parentNode.id==‘list1‘) {
            e.target.style.background=‘green‘;//此事件可以添加给未来新创建元素
        }
        if (e.target.nodeName==‘LI‘&&e.target.parentNode.id==‘list2‘) {
            e.target.style.background=‘red‘;
        }
    }
</script>
</body>
</html>
<!-- 事件委托、获取事件源兼容写法、e.target.nodeName==‘LI‘ -->
<!-- 事件委托给父级可以解决未来元素问题 -->

四、获取当前事件源

在火狐中获得触发事件的元素(事件源)可以用:event.target
在IE中获得触发事件的元素(事件源)可以用:event.srcElement

var Target = event.target||event.srcElement;

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4 <meta charset="UTF-8">
 5 <title>事件委托2</title>
 6 <style>
 7 *{margin:0;padding:0;list-style: none;}
 8 div{
 9     background: pink;
10 }
11 h3,p,span,h4,h5,var,strong,em{
12     display: inline-block;
13     width:230px;
14     height:40px;
15     line-height: 40px;
16     text-align: center;
17     font-size: 30px;
18     background: #ccc;
19     margin:10px;
20 }
21 </style>
22 </head>
23 <body>
24     <div id="parent">
25         <h3>我是h3标签</h3>
26         <p>我是p标签</p>
27         <span>我是span标签</span>
28         <em>我是em标签</em>
29         <h4>我是h4标签</h4>
30         <strong>我是strong标签</strong>
31         <var>我是var标签</var>
32         <h5>我是h5标签</h5>
33         <span>我是span标签</span>
34         <p>我是p标签</p>
35     </div>
36 <script>
37     var parent=document.getElementById(‘parent‘);
38     var tags=parent.children;
39     parent.onmouseover=function(ev){
40         var e=ev||window.event;
41         console.log(e);
42         var target=e.target||e.srcElement;//事件源
43         if (target.id!=‘parent‘) {
44             target.style.background=‘green‘;
45         }
46     }
47     parent.onmouseout=function(ev){
48         var e=ev||window.event;
49         var target=e.target||e.srcElement;//事件源
50         if (target.id!=‘parent‘) {
51             target.style.background=‘#ccc‘;
52         }
53     }
54 </script>
55 </body>
56 </html>

五、获取目标源

1、在mouseover事件中,它指向鼠标来自哪个元素
event.relatedTarget火狐获取触发事件的目标源,与target相反,也是事件委托类型
fromElement IE获取触发事件的目标源,与srcElement相反,也是事件委托类型

var from=event.relatedTarget||event.fromElement;

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4 <meta charset="UTF-8">
 5 <title>事件委托4-from</title>
 6 <style>
 7 *{margin:0;padding:0;list-style: none;}
 8 #box{
 9     width:200px;
10     height:200px;
11     margin:10px auto;
12     border:1px solid #666;
13     position: relative;
14     overflow: hidden;
15 }
16 #box img{
17     width:140px;
18     height:140px;
19     position:absolute;
20     top:10px;
21     left:30px;
22 }
23 #box h3{
24     width:200px;
25     height:40px;
26     line-height: 40px;
27     position: absolute;
28     top:160px;
29     left:0;
30     text-align: center;
31     background: #ccc;
32 }
33 </style>
34 </head>
35 <body>
36 <div id="box">
37     <img src="005.jpg" >
38     <h3>风景名胜</h3>
39 </div>
40 <script>
41     var box=document.getElementById(‘box‘);
42     var img=box.getElementsByTagName(‘img‘)[0];
43     var timer=null,t=0;;
44     box.onmouseover=function(ev){
45         var e=ev||window.event;
46         var from=e.relatedTarget||e.fromElement;//鼠标来自哪里
47         while (from) {//阻止动画反复执行
48             if (from==this) {
49                 return false;
50             }
51             from=from.parentNode;
52         }
53         t=-150;
54         clearInterval(timer);
55         timer=setInterval(function(){
56             t+=2;
57             if(t>=10){
58                 t=10;
59             }
60             img.style.top=t+‘px‘;
61         },10)
62     }
63 </script>
64 </body>
65 </html>
66 <!-- 获取目标源 var from=event.relatedTarget||event.fromElement -->
67 <!-- 在mouseover事件中,它指向鼠标来自哪个元素 -->

2、在mouseout事件中,它指向鼠标去往的那个元素

event.relatedTarget火狐获取触发事件的目标源,与target相反,也是事件委托类型
event.toElement IE获取触发事件的目标源,与srcElement相反,也是事件委托类型

var to=event.relatedTarget||event.toElement;

六、事件监听-不覆盖

 1 <!doctype html>
 2 <html>
 3 <head>
 4 <meta charset="utf-8">
 5 <title></title>
12 </head>
13 <body>
14 <h1 id="con">我是h1标签</h1>
15 <script>
16     var con=document.getElementById(‘con‘);
17     con.onclick=function (){
18         alert(1);
19     }
20     con.onclick=function (){
21         alert(2);
22     }
23     con.onclick=function (){
24         alert(3);
25     }
26     con.addEventListener(‘click‘,function (){
27         alert(4);
28     },false);
29     con.addEventListener(‘click‘,function (){
30         alert(5);
31     },false);
32     con.addEventListener(‘click‘,function (){
33         alert(6);
34     },false);
35 </script>
36 </body>
37 </html>
38 <!-- 弹出结果:3,4,5,6 -->
时间: 2024-12-28 13:22:30

[JS]笔记14之事件委托的相关文章

JS与Jquery的事件委托机制

传送:http://www.ituring.com.cn/article/467 概念: 什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来做,完成这个事件. 举个列子:有三个同事预计会在周一收到快递.为签收快递,有两种办法:一是三个人在公司门口等快递:二是委托给前台MM代为签收.现实当中,我们大都采用委托的方案(公司也不会容忍那么多员工站在门口就为了等快递).

[JS]笔记12之事件机制--事件冒泡和捕获--事件监听--阻止事件传播

-->事件冒泡和捕获-->事件监听-->阻止事件传播 一.事件冒泡和捕获 1.概念:当给子元素和父元素定义了相同的事件,比如都定义了onclick事件,点击子元素时,父元素的onclick事件也会被触发.js里称这种事件连续发生的机制为事件冒泡或者事件捕获.IE浏览器:事件从里向外发生,事件从最精确对象(target)开始触发,然后到最不精确的对象(document)触发,即事件冒泡 Netscape:事件从外向里发生,事件从最不精确的对象(document)开始触发,然后到最精确对象(

JS与Jquery的事件委托

参考:http://www.ituring.com.cn/article/467 概念: 什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来做,完成这个事件. 举个列子:有三个同事预计会在周一收到快递.为签收快递,有两种办法:一是三个人在公司门口等快递:二是委托给前台MM代为签收.现实当中,我们大都采用委托的方案(公司也不会容忍那么多员工站在门口就为了等快递).

冒泡事件与事件委托

事件发生:任何一次操作,都会产生相应的事件事件监听:程序中是写了代码对关注事件进行捕捉和处理 冒泡事件:子元素触发的事件会向上传递,如果父类有监听同类型事件,会被激活 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-wi

JS和JQuery中的事件委托 学习笔记

事件委托其实并不是一个很高级的技巧,比如在一个页面里面,当只存在两个按钮的时候,可能你给按钮添加监听是这样的:(本文不考虑浏览器兼容性,关于事件的兼容性可参考前面的学习笔记) <div id="container"> <button id="btn1">按钮1</button> <button id="btn2">按钮2</button> </div> var btn1 =

JS(原生)事件委托:为动态创建的节点绑定事件

项目开发中经常需要为动态创建的节点绑定事件, 比如需要创建一个动态列表:在li的数量非常少的时候,为每一个li绑定事件不会存在太多性能方面的问题,但是当列表非常的长,长到上百上千甚至上万的时候(假设),为每个li绑定事件就会对页面性能产生很大的影响.当有大量元素需要绑定相同事件的时候可采用事件委托,将在目标元素上要处理的事件委托给父元素或者祖先元素 优点    事件委托对于web应用程序的性能有如下几个优点:    1.需要管理的函数变少了    2.占用的内存少了    3.javascrip

JS之捕获冒泡和事件委托

一.事件流(捕获,冒泡) 事件流:指从页面中接收事件的顺序,有冒泡流和捕获流. 当页面中发生某种事件(比如鼠标点击,鼠标滑过等)时,毫无疑问子元素和父元素都会接收到该事件,可具体顺序是怎样的呢?冒泡和捕获则描述了两种不同的顺序. DOM2级事件规定事件流包括三个阶段,如图: 假如我们点击一个div, 实际上是先点击document,然后点击事件传递到div,而且并不会在这个div就停下,div有子元素就还会向下传递,最后又会冒泡传递回document,如上图 为了兼容更多的浏览器,非特殊情况一般

js事件冒泡和事件委托

js所谓的事件冒泡就是子级元素的某个事件被触发,它的上级元素的该事件也被递归执行 html: 1 <ul class="clearfix" data-type="cityPick"> 2 <li class="active_sort_opts" data-id="0">全部</li> 3 <li data-id="88">纽约</li> 4 <

js事件代理(事件委托)最简单的理解

1事件代理:当我们需要对很多元素添加事件的时候,可以通过将事件添加到它们的父节点而将事件委托给父节点来触发处理函数. 例如:点击按钮删除对应的条目. 如果给每一个按钮添加事件,极为繁琐,这时候需要用到事件代理. 事件代理是基于浏览器的事件冒泡机制. 下面是对应的代码: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <