事件绑定


  • 要想让 javascript对用户的操作作出响应,首先要对 dom 元素绑定事件处理函数。所谓事件处理函数,就是处理用户操作的函数,不同的操作对应不同的名称
  • javascript中,有三种常用的绑定事件的方法

    • dom元素中直接绑定;
    • javascript代码中绑定;
    • 绑定事件监听函数

dom中直接绑定事件

1
2
3
4
5
6
7



javascript代码中绑定事件

  • javascript代码中(即script标签内)绑定事件可以使javascript代码与HTML标签分离,文档结构清晰,便于管理和开发
1
2
3
4
5
6
7



使用事件监听绑定事件

  • 关于事件监听,W3C规范中定义了3个事件阶段,依次是捕获阶段、目标阶段、冒泡阶段
  • 起初Netscape制定了javascript的一套事件驱动机制(即事件捕获)。随即IE也推出了自己的一套事件驱动机制(即事件冒泡)。最后W3C规范了两种事件机制,分为捕获阶段、目标阶段、冒泡阶段。IE8以前IE一直坚持自己的事件机制(前端人员一直头痛的兼容性问题),IE9以后IE也支持了W3C规范

W3C规范

  • 语法
1
element.addEventListener(event, function, useCapture)
  • event : (必需)事件名,支持所有dom事件。
  • function:(必需)指定要事件触发时执行的函数。
  • useCapture:(可选)指定事件是否在捕获或冒泡阶段执行。true,捕获。false,冒泡。默认false

  • 注:IE8 以下不支持

1
2
3
4
5
6
7
8



IE标准

  • 语法:
1
element.attachEvent(event, function)
  • event:(必需)事件类型。需加“on“,例如:onclick
  • function:(必需)指定要事件触发时执行的函数
1
2
3
4
5
6
7
8



事件监听的优点

  • 可以绑定多个事件
1
2
3
4
5
6
7
8
9
10
11



常规的事件绑定只执行最后绑定的事件

1
2
3
4
5
6
7
8
9
10
11
12
13
14



两个事件都执行了

  • 可以解除相应的绑定
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15



  • 封装事件监听
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25


//绑定监听事件
function addEventHandler(target,type,fn){
if(target.addEventListener){
target.addEventListener(type,fn);
}else{
target.attachEvent("on"+type,fn);
}
}

//移除监听事件
function removeEventHandler(target,type,fn){
if(target.removeEventListener){
target.removeEventListener(type,fn);
}else{
target.detachEvent("on"+type,fn);
}
}

//测试
var btn5 = document.getElementById("btn5");
addEventHandler(btn5,"click",hello1);//添加事件hello1
addEventHandler(btn5,"click",hello2);//添加事件hello2
removeEventHandler(btn5,"click",hello1);//移除事件hello1

事件委托

  • 事件委托就是利用冒泡的原理,把事件加到父元素或祖先元素上,触发执行效果
1
2
3
4
5
6
7
8
9
10


var btn6 = document.getElementById("btn6");
document.onclick = function(event){
event = event || window.event;
var target = event.target || event.srcElement;
if(target == btn6){
alert(btn5.value);
}
}
事件委托优点
  • 提高javascript性能。事件委托可以显著的提高事件的处理速度,减少内存的占用
  • 传统写法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

  • item1

  • item2

  • item3




    • 事件委托
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22

    • item1

    • item2

    • item3




      • 动态的添加dom元素,不需要因为元素的改动而修改事件绑定
      • 传统写法
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24

      • item1

      • item2

      • item3




        • 点击item1到item3都有事件响应,但是点击item4时,没有事件响应。说明传统的事件绑定无法对动态添加的元素而动态的添加事件。
        • 事件委托
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22

        • item1

        • item2

        • item3




          • 当点击item4时,item4有事件响应。说明事件委托可以为新添加的dom元素动态的添加事件

          转载请保持原始链接

          原始链接: https://ru23.com/note/ebeaea04.html