DOM:事件高级-注册事件、删除事件、事件流、事件对象、事件委托

目录

1. 注册事件(绑定事件)

1.1 概述

1.2 addEventListener 事件监听方式

1.3 attchEvent事件监听(兼顾ie9以下浏览器)

1.4 注册事件兼容性解决方案

2. 删除事件 (解绑事件)

2.1 删除事件两方式

2.2 删除事件兼容性解决方案

3. DOM 事件流

3.1 概述

3.2 事件流代码验证

4. 事件对象(重点)

 4.1 事件对象常见的属性和方法

5. 阻止事件冒泡(面试常问)

5.1 stopPropagation()

5.2 e.canvelBubble

5.2.1 e.canvelBubble兼容问题解决

6. 事件委托(代理、委派)

7. 常用的鼠标事件

7.1 禁止鼠标右键菜单和禁止鼠标选中(selectstart)

7.2 鼠标事件对象

7.2.1 跟随鼠标的小天使案例

8. 键盘事件

8.1 常用的键盘事件

8.2 键盘使用对象

8.2.1模拟京东按键输入内容案例


1. 注册事件(绑定事件)

1.1 概述

给元素添加事件称,注册事件

注册事件有两种方法:传统方式和方法监听注册方法

传统注册方式

  • 利用on开头
  • <button οnclick="alert(hi~) > </button>
  • btn.οnclick=function(){}
  • 特点:注册事件的唯一性
  • 同一元素同一事件只能设置一个处理函数,最后注册的处理函数会覆盖前面注册的处理函数

方法监听注册方法

  • w3c的标准 推荐方法
  • addEventListener()是一个方法
  • ie9 前不兼容,可用attachEvent()代替 

1.2 addEventListener 事件监听方式

该方法将指定监听器注册到目标对象上,当事件触发指定的事件时,就会执行事件处理函数

evenTarget.addEventListener(type,lisstener[,useCapure])

该方法接收三个参数:

  • type:事件类型字符串,click、mouseover,注意不用on
  • listen:事件处理函数,事件发生时,会调用这个函数
  • useCapture:可选参数,是一个布尔值默认false
  • 同一个元素,同一个事件可以添加多个监听器(事件处理程序)

1.3 attchEvent事件监听(兼顾ie9以下浏览器)

evenTarget.attchEvent(eventNameWithon,callback)

  •  eventNameWithon:事件类型字符串,onclick,onmouseover,带on
  • callback:事件处理函数,当目标触发事件时回调函数被调用

1.4 注册事件兼容性解决方案

  • 兼容处理的原则:兼顾大多数的浏览器

 function addEventListener(element, eventName, fn) {
        // 判断当前浏览器是否支持 addEventListener 方法
        if (element.addEventListener) {
          element.addEventListener(eventName, fn); //第三个参数 默认为false
        } else if (element.attachEvent) {
          element.attachEvent("on" + eventName, fn);
        } else {
          // 相当于element.onclick = fn;
          element["on" + eventName] = fn;
        }
      }

2. 删除事件 (解绑事件)

2.1 删除事件两方式

1.传统删除方式

eventTarget.οnclick=null;

 2. 方法监听删除方式

  1. evenTarget.removeEventListener(type,lisstener[,useCapure])
  2. evenTarget.detachEvent(eventNameWithon,callback)

2.2 删除事件兼容性解决方案

function removeEventListener(element, eventName, fn) {
  if (element.removeEventListener) {
    element.removeEventListener(eventName, fn);
  } else if (element.detachEvent) {
    element.detachEvent('on' + eventName, fn);
  } else {
    element['on' + eventName] = null;
  }
}

3. DOM 事件流

3.1 概述

事件流是从页面中接收事件的顺序

事件发生时在元素节点按照特定的顺序传播,这个传播过程DOM事件流

DOM 事件流分三个阶段:捕获阶段、当前目标阶段、冒泡阶段 

  • 事件冒泡:ie最早提出,事件开始由具体元素接收,逐级向上级传播到DOM最顶层节点的过程
  • 事件捕获:网景最早提出,DOM最顶层节点开始,逐级向下传播到元素接收的过程

3.2 事件流代码验证

  • js只能执行捕获盒子冒泡其中一个阶段
  • onclick和attacEvent 只能得到冒泡阶段
  • evenTarget.removeEventListener(type,lisstener[,useCapure]) 第三个参数为true,表示捕获阶段调用事件处理程序;为false(非默认)表示冒泡阶段调用事件处理程序

 

 在实际开发中,很少用捕获阶段,更常用事件冒泡

有些事件是没有冒泡的:onblu、onfocus、onmouseenter、onmouseleave

4. 事件对象(重点)

  • event对象代表事件的状态,如键盘状态、鼠标状态、鼠标按键状态等
  •  event是一个事件对象,写到侦听函数的()里面,当做形参来看
  • 事件对象只有事件才存在,是系统自动创建,不需要传递参数
  • 事件对象是我们一系列数据的集合,如鼠标事件,键盘事件
  • 这个时间对象可以自己命名,如event、evt、e
  • 有兼容问题,ie678通过 window.event

 4.1 事件对象常见的属性和方法

事件对象属性方法说明
e.target返回触发事件的对象  标准
e.scrElement返回触发事件的对象   非标准,ie6-8使用
e.type返回事件类型    如 click 不带on
e.canvelBubble阻止冒泡   非标准,ie6-8使用,如不让链接跳转
e. returnVlue阻止默认事件(默认行为)非标准,如不让链接跳转
e. prevenDefault()阻止默认事件(默认行为)标准,如不让链接跳转
e. stopPropagation()阻止冒泡  标准

 阻止默认行为可以用在事件里面 return false,无兼容问题;但是后面的代码无法执行

target 和 this 返回的区别:

  • target返回触发事件的对象(点击对象)
  • this返回绑定事件的对象(绑定对象)
  • 与this 相似属性:currentTarget,ie678不兼容

5. 阻止事件冒泡(面试常问)

事件冒泡:开始时由具体元素接收,逐渐向上传播到DOM的最顶层节点

5.1 stopPropagation()

是标准,有兼容性问题

5.2 e.canvelBubble

兼顾ie6-8

5.2.1 e.canvelBubble兼容问题解决

if (e && e.stopPropagation) {
                e.stopPropagation(); //ie678 不适用
            } else {
                window.event.cancelBubble = true; // 适用于 ie 678 
            }

6. 事件委托(代理、委派)

事件委托称事件代理,在 jQuery里称事件委派

事件委托原理(面试常问):

 不是每个子节点单独设置事件监听器,而是事件监听器设置在其父节点上,然后利用冒泡原理影响每个子节点

 事件委托作用:只操作了一次DOM,提高了程序的性能

7. 常用的鼠标事件

7.1 禁止鼠标右键菜单和禁止鼠标选中(selectstart)

contextmenu 主要控制何时显示上下文菜单,主要是用于开发者取消默认的上下文菜单

        document.addEventListener('contextmenu',function(e){
            e.preventDefault();
        })
        p.addEventListener('selectstart', function (e) {
            e.preventDefault();
        })

7.2 鼠标事件对象

event对象代表的是事件的状态,鼠标事件对象mouseEvent和键盘事件对象 keyboardEvent

获得鼠标在页面中的坐标:

在可视区的坐标:e.clientY;e.clientX 属性

在页面文档的坐标:e.pageX;e.pageY 属性(ie9以上支持),用的较多

7.2.1 跟随鼠标的小天使案例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        img {
            position: absolute;
        }
    </style>
</head>

<body>
    <!-- 案例分析:鼠标移动mousemove -->
    <!-- 1在页面移动document注册事件 -->
    <!-- 2图片要移动距离,且不占位置绝对定位 -->
    <!-- 3核心原理:鼠标移动,获得新鼠标坐标,把坐标做图片的top和left值,就可以移动图片 -->
    <img src="images/angel.gif" alt="">
    <script>
        var img = document.querySelector('img');
        document.addEventListener('mousemove', function (e) {
            console.log(1);
            var x = e.pageX;
            var y = e.pageY;
            img.style.top = y + 'px'; // 记得加px单位
            img.style.left = x + 'px';
        })
    </script>
</body>

</html>

8. 键盘事件

8.1 常用的键盘事件

键盘触发触发条件
onkeyup键盘按下被松开时触发
onkeydown键盘被按下时触发
onkeypress键盘被按下时触发 但是不识别功能键ctrl、shift
  • 执行顺序:onkeydown,onkeypress,keyup
  • 如果用addElementListener 不需要加on
  • keydown 和 keypress 在文本框里面的特点:它们两个事件触发的时候,文字还没落入文本框中
  • keyup 事件触发时,文字已经落在文本框中了

8.2 键盘使用对象

  • 对象属性:e.keyCode,返回该键的ASCII值
  • keyup和keydown事件不区分大小写
  • keypress区分大小写  a97,A65

8.2.1模拟京东按键输入内容案例

 案例:按下s键把光标输入到搜索框

思路:用keycode判断用户按下键,用focus()方法获得焦点

<body>
    <input type="text">
    <script>
        var search = document.querySelector('input');
        document.addEventListener('keyup', function (e) {
            if (e.keyCode == 83) {
                search.focus();
            }
        })
    </script>
</body>

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值