DOM-事件对象复习巩固

123 阅读4分钟

1.addEventListener注册事件

1.1点语法注册事件:     事件源.事件类型 = 事件处理函数

            * 特点:不能注册‘同名事件’, 否则会覆盖

1.点语法
         box.onclick = function(){
             alert(11111)
         

1.2事件源.addEventListener('事件类型',事件处理函数)

            * 特点:可以注册‘同名事件’,依次触发

 2.addEventListener()
 /**
        * @description: 给元素注册同名事件
        * @param {string} 事件类型  不要on
        * @param {function} 事件处理函数
        * @return: 
   */
        box.addEventListener('click',function(){
            alert('1-知足上进')
        })


        box.addEventListener('click',function(){
            alert('2-温柔坚定')
        })

2.removeEventListener移除事件

 2.1 点语法移除事件, 赋值null

        box.onclick = null

    //2.addEventListener()
    /**
    * @description: 给元素注册同名事件
    * @param {string} 事件类型  不要on
    * @param {function} 事件处理函数
    * @return: 
    */
    box.addEventListener('click',function(){
        alert('1-假如生活欺骗了你,请不要悲伤')
    })


    let fn = function(){
        alert('2-因为它明天还会继续欺骗你')
    }


    /* 
    fn    :    取出函数堆地址 (函数也是一种数据类型,也可以像变量一样赋值)
    fn()  :    调用函数
    */
    box.addEventListener('click', fn )

    //移除事件 : 参数与addEventListener一致
    /* 注意点: 只能移除具名函数, 无法移除匿名函数 */
    box.removeEventListener('click', fn )

 2.2-阻止默认事件

1.html中有部分标签自带点击事件 :   form表单,a标签

        2.如果给这些标签注册点击事件,会默认跳转

        3. 阻止默认事件 : 执行自己注册的事件

            **e.preventDefault()**

        //获取元素
        let a = document.querySelector('a')
        let btn = document.querySelector('.btn')
        //注册事件
        a.onclick = function(e){
            e.preventDefault()
            console.log('111111')
        }


        btn.onclick = function(e){
            let uname = document.querySelector('.username').value
            let pwd = document.querySelector('.password').value
            console.log( uname,pwd )
            e.preventDefault()
        }

3.事件对象

1.事件对象 : 是存储与事件相关的对象。

      * 当用户触发事件的时候,浏览器会自动捕捉触发时(鼠标坐标和键盘按键)的信息,存入对象中。这个对象称之为事件对象。

    2.如何获取事件对象 :  给事件处理函数添加形参  event  ev  e

    3.事件对象常用属性 : 

     3.1 e.pageX / e.pageY :鼠标触发点 到页面左上角距离

let box = document.querySelector('#box')
    box.onclick = function (e) {
      console.log(e)
      console.log(e.pageX, e.pageY)

3.1事件对象常用属性

1.事件对象 :是存储事件相关数据的对象

        * 用户触发事件的时候,浏览器会自动捕捉触发时候的(鼠标与键盘)数据,存入一个对象中,这个对象就叫做事件对象

      2.事件对象获取 : 事件处理函数添加形参

      3.事件对象常用属性 :

          e.pageX / e.pageY : 获取鼠标触发点到页面左上角距离

 document.querySelector('#box').onclick = function(e){
        console.log( e.pageX,e.pageY)
      }

案例(单词必备)

   1.鼠标事件

    **onclick : 鼠标单击**

        ondblclick : 鼠标双击

        onmouseenter : 鼠标移入

    **onmouseleave : 鼠标移出**

        onmousemove : 鼠标移动

 

      2.网页鼠标移动 :  window.onmousemove

  window.onmousemove = function(e){
    console.log(e.pageX,e.pageY)
    /* 注意点:(1)pageX是数字,设置的时候需要拼接px单位 (2)元素移动前提要有定位 */
    document.querySelector('img').style.left = e.pageX + 'px' 
    document.querySelector('img').style.top = e.pageY + 'px' 
  }

 3.2-键盘事件与获取按键

 1.键盘事件总结

        **onfocus** : 成为键盘焦点

        **onblur** : 失去键盘焦点

        **oninput** : 键盘输入

          * 实时获取输入内容

        **onkeydown** : 键盘按下

          * 监听enter键

        **onkeyup**   : 键盘松开

 

      2.如何获取用户按键

        **e.key** :  获取字符串 'Enter'

        **e.keyCode** : 获取键盘码ASCII码 13

          * 键盘上每一个按键对应一个数字,称之为ASCII码

document.querySelector('input').onkeydown = function(e){

    console.log(e)
    console.log(e.key,e.keyCode)
    // console.log('1-键盘按下')
    if(e.key == 'Enter'){
      console.log('执行搜索功能');
    }
    // keyCode : enter的ascii码
    if(e.keyCode == 13 ){
      console.log('执行搜索功能')
    }
  }


  document.querySelector('input').onkeyup = function(){
    // console.log('2-键盘松开')  
  }

 4.事件流与事件委托

 4.1事件冒泡介绍
  

含义: 当触发子元素事件时,所有的父级元素‘同名事件’会被依次触发

        子元素->父元素->body->html->document->window

//子元素 document.querySelector('.son').onclick = function(e){ alert('我是蓝色子元素') console.log(e); }

  //父元素
  document.querySelector('.father').onclick = function(){
    alert('我是红色父元素')
  }


   //body
   document.body.addEventListener('click',function(){
    alert('我是body')
  })


  //html
  document.documentElement.addEventListener('click',function(){
    alert('我是html')
  })


  //document
  document.addEventListener('click',function(){
    alert('我是document')
  })


  //window
  window.addEventListener('click',function(){
    alert('我是window')
  })

 4.2事件委托(重点)

1.**事件委托**: 给父元素注册事件,委托子元素来处理

            2.1 事件委托原理:事件冒泡

            2.2 事件委托注意点 : 不能使用this

                this: 事件源,指向父元素

                **e.target**: 事件触发源,指向具体触发这个事件委托的子元素

//需求:给每一个li元素注册点击事件,点击之后显示自己的文本

  /* 方式一:以前的写法,遍历数组逐一注册 */
  // let liList = document.querySelectorAll('ul>li');
  // //遍历数组
  // for(let i = 0;i<liList.length;i++){
  //    //逐一注册
  //    liList[i].onclick = function(){
  //         //this: 当前点击的li元素
  //         alert(this.innerText);
  //    };
  // };


  /* 方式二:使用事件冒泡,给父元素注册 */
  let ul = document.querySelector('ul')
  ul.onclick = function (e) {
    /* 
    this : 事件源。 这个事件给谁注册的。
    e.target : 事件触发源。 这个事件触发的源头,到底点击的哪一个子元素触发的这个点击事件。
    */
    alert(e.target.innerText)
  }

 4.3事件捕获(了解) :

当触发子元素的事件时候,先从最顶级父元素,一级一级往里触发

        1.规则:  **window->document->html->body->父元素->子元素**

2.默认情况下注册的事件都是冒泡类型事件,只有唯一的一种语法可以注册捕获类型事件

            元素.addEventListener('事件类型',事件处理函数,true)

 4.4事件流三个阶段

事件流三个阶段  :  **e.eventPhase** 获取事件阶段

        (1)捕获阶段

        (2)目标阶段

        (3)冒泡阶段

 

 4.5-阻止事件流动

阻止事件流动:   **e.stopPropagation()**

        * 无论是冒泡还是捕捉都可以阻止(停止事件流)