Js 事件基础

一:js中常见得事件html

 

(1) : 鼠标事件
        click :点击事件
        dblclick :双击事件
        contextmenu : 右键单击事件
        mousedown :鼠标左键按下事件
        mouseup :鼠标左键抬起事件
        mousemove :鼠标移动
        mouseover :鼠标滑入事件
        mouseout :鼠标滑出事件
        mouseenter :鼠标移入事件
        mouseleave :鼠标移出事件
(2):键盘事件
        keyup : 键盘抬起事件
        keydown : 键盘按下事件
        keypress : 键盘按下事件
(3):表单事件
        change : 表单内容改变事件
        input : 表单内容输入事件
        blur : 表单失去焦点
        focus: 表单获取焦点
 
二:事件侦听过程详解
  
  1:事件侦听 - 就是给事件源(dom元素)绑定一个事件
    
    给DOM元素添加一个事件侦听(监听),这个DOM元素只能收到对应事件类型的消息
    语法DOM元素.addEventListener(事件类型,事件回调函数,是否捕获时执行)   - addEventListener这个就是用来侦听事件得关键字
   侦听事件addEventListenerd的三个参数参数: 
                参数1:事件类型 - 必须是字符串,能够设置为任意字符串,可是部分字符串是系统事件类型
                参数2: 事件回调函数 - 指向一个函数,当收到事件时执行该函数,若是没有收到不执行函数,写侦听事件时不执行函数
                   注意1:事件回调函数 - 有且仅有一个参数 为 e  - event对象
                   注意2:e 是一个事件对象,侦听事件收到消息时得到的事件对象
     参数3:是否捕获时执行 - 默认值是false,在冒泡时执行,捕获时不执行 / 若是设置为true,在捕获时执行
1 // 建立一个侦听事件 , 事件类型为 点击 click ,回调函数为clickHandler ,默认 冒泡
2             document.addEventListener('click',clickHandler)
3 
4 // 事件回调函数的参数  MouseEvent - 鼠标事件
5             function clickHandler(e) {
6                 console.log("我被点击了")  
7             }

  在上面得代码中侦听事件得对象为 document 就是网页,当咱们点击网页得任何一个位置就会触发点击事件,那么就会执行事件的回调函数 clickHandler,打印结果dom

  1.2:删除事件  函数

    删除事件 : 语法 - 侦听对象.removeEventListener(事件类型,事件回调函数)  IE8 以上支持
               删除事件的兼容写法:attachEvent 仅IE8及如下支持    事件类型   "on"+type   没有捕获、冒泡阶段选项
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1.0">
 6     <title>Document</title>
 7 </head>
 8 <body>  
 9     <button id="btn">按钮</button>
10 </body>
11 <script>
12         // 获取dom元素
13         var btn = document.querySelector('#btn')
14         // 侦听事件
15         btn.addEventListener('click',clickHandler1)
16         // 事件回调函数
17         var num = 0
18         function clickHandler1(e){
19             num++
20             console.log('当num > 3 得时候删除事件')
21             if (num>3){
22                 // 删除事件
23                 e.currentTarget.removeEventListener('click',clickHandler1)
24             }
25         }    
26 </script>
27 </html>

  当咱们不断点击按钮,就会不断的触发事件,每点击一次 num 的值就会增长,当num大于3时,就删除本次建立的事件和事件回调函数,为何要删除事件呢?由于当元素的事件再也不使用时,必须删除,不然会形成内存堆积,侦听事件都会被存储在堆中,当元素被删除了,也必须删除该元素的全部事件。spa

 

  2:事件侦听 与 抛发  code

   事件侦听语法 : 事件侦听对象.addEventListener(事件类型,事件回调函数,是否捕获时执行)htm

   建立事件对象语法:var evt = new Event(事件类型)  -指建立一个事件对象对象

        抛发事件语法: 事件侦听对象.dispatchEvent(接受事件对象变量)
   在咱们建立事件的过程当中,必须先侦听在抛发   - 若是先抛发在侦听,咱们将没法获取到事件是否被触发
            在咱们使用侦听事件的过程当中须要注意:
                1:事件抛发通常分两种 : 系统抛发事件 /  自定义抛发事件(须要咱们本身建立事件对象)
                2:侦听 和 抛发的对象 是同一个
                3:侦听 和 抛发的事件类型 彻底相同
                4:事件回调函数不能使用return 返回值,可是能够return 跳出
       
 1 // 侦听事件
 2         document.addEventListener('奥里给',customHandler)
 3 // 建立一个事件对象 
 4         var evt = new Event('奥里给')
 5 // 抛发事件
 6         document.dispatchEvent(evt)
 7 // 事件回调函数
 8         function customHandler(e) {
 9             console.log(e.type)  //e.type 查看事件的类型
10 }

 

 

三:事件三阶段
  
       一阶段:捕获 由外到内
                 二阶段:目标 到达目标
                 三阶段:冒泡 由内到外
  事件三阶段案例:先写好html代码显示三个背景颜色不同的块。以下
js代码
 1 // 获取 标签
 2     var div0 = document.querySelector('.div0')    // 绿色背景块
 3     var div1 = document.querySelector('.div1')    // 浅粉色块
 4     var div2 = document.querySelector('.div2')    // 红色块
 5 
 6      // 给每一个块都添加点击事件  
 7     div0.addEventListener('click',clickHandler0)
 8     div1.addEventListener('click',clickHandler1)
 9     div2.addEventListener('click',clickHandler2)
10     function clickHandler0(e){
11         console.log('点击div0')
12     }
13 
14     function clickHandler1(e){
15         console.log('点击div1')
16         
17     }
18 
19     function clickHandler2(e){
20         console.log('点击div2')
21     }

当咱们在点击红色块时,咱们会发现,div1和div2都被打印了,这就是事件的冒泡,咱们点击的真正目标为红色块div2,可是却触发了其余两个块,那么事件如何进行三阶段的呢?   首先当咱们点击红色块div2时,事件进入一阶段,捕获阶段,他会先进入div0,查找目标,当没有发现,会进入下一层查找目标,当进入粉丝块时,也没有发现咱们想要的目标,当进入红色块div2 时,就会找到咱们点击的目标,div2,这个时候事件的一阶段就变成了二阶段,目标阶段,就会开始向外发送信息触发事件,执行事件回调函数,并由二阶段变成三阶段,冒泡阶段,这时是由内向外的一个过程,不断的往外并触发通过的块的事件,直到最外层,这就是事件三阶段的全过程。那么咱们可不可让他不冒泡呢,有 blog

阻止冒泡语法 e.stopPropagation()  只须要写在想中止冒泡的事件回调函数中

阻止事件冒泡 - 当咱们只想让红色块触发事件,其余两个块不触发就是不冒泡,就在红色块的事件回调函数中,写上阻止事件冒泡,这样当事件到二阶段找到目标时,就不会往外冒泡了,那么div0和div1就不会被触发,看以下代码,
 1     div0.addEventListener('click',clickHandler0)
 2     div1.addEventListener('click',clickHandler1)
 3     div2.addEventListener('click',clickHandler2)
 4     function clickHandler0(e){
 5         console.log('点击div0')
 6         
 7     }
 8 
 9     function clickHandler1(e){
10         console.log('点击div1')
11         
12     }
13 
14     function clickHandler2(e){
15         e.stopPropagation()  // 阻止事件冒泡
16         console.log('点击div2') 
17 
18     }

这就是事件的三阶段过程,当你想在哪里阻止就在哪里书写阻止事件的方法,是很给力的
相关文章
相关标签/搜索