【Javascript】Javascript高级程序设计:js 事件 随手笔记


一、事件概述

1.1 html 与 js

js 与 html 的交互是通过 事件 实现的

事件:文档或浏览器窗口中发生的特定交互瞬间。可以使用侦听器(或处理程序)预订事件,以便执行事件发生的相应代码

下面介绍与事件相关的核心概念

1.2 事件流

事件流:页面中接收事件的顺序。当点击 button 按钮时,也点击了 button 的容器元素,甚至点击了整个页面。

事件流分为:事件冒泡事件捕获
在这里插入图片描述
IE 的事件流为事件冒泡

下面,我们通过一个例子展示事件冒泡与事件捕获
事件冒泡

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
    <style>
        div {
            width: 200px;
            height: 200px;
            background-color: pink;
        }
    </style>
</head>
<body>
    <div>
        <button>点击按钮</button>
    </div>

    <script>
        var div = document.querySelector("div");
        var btn = document.querySelector("button");

        document.addEventListener("click", function() {
            console.log("click document");
        })

        div.addEventListener("click", function() {
            console.log("click div");
        })

        btn.addEventListener("click", function() {
            console.log("click button");
        })
    </script>
</body>
</html>


当点击 button 时,冒泡事件按从最精确的目标到最不精确的目标触发,直到冒泡到 document 为止

事件捕获

// 只需要把addEventListener第三个参数改为 true 即可
        document.addEventListener("click", function() {
            console.log("click document");
        }, true);

        div.addEventListener("click", function() {
            console.log("click div");
        }, true);

        btn.addEventListener("click", function() {
            console.log("click button");
        }, true);

在这里插入图片描述

1.3 DOM 事件流

dom 事件规定的事件流包括三个阶段:事件捕获阶段、处于目标阶段、事件冒泡阶段。对应:捕获到事件、实际目标接收到事件、对事件做出响应

事件捕获和事件冒泡都会发生,捕获先发生,冒泡后发生

对于上面的代码所对应的各个阶段,对于 button 点击事件来说:

  1. 事件捕获:从点击 button,到 document、body、div。不到 button ,属于事件捕获阶段
  2. 目标阶段:button 接收到点击事件并处理事件
  3. 冒泡阶段:事件冒泡回 div、body、document 阶段

二、事件处理程序

2.1 html 事件处理程序

元素支持的每种事件,都可以使用一个与相应事件处理程序同名的 html 特性来指定

比如 点击事件 onclick

<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <title>Document</title>
</head>
<body>
   <button onclick='alert("button被点击");'>点击</button>
</body>
</html>

在这里插入图片描述

2.2 dom0 级事件处理程序

每个元素都有自己的事件处理程序属性。把这种属性值设置为一个函数,就可以指定事件处理程序

<head>
   <title>Document</title>
</head>
<body>
   <button>点击</button>
   <script>
       var btn = document.querySelector("button");
       btn.onclick = function() {
           alert("button 被点击");
       }
   </script>
</body>
</html>


也可以把属性值设置为 null,删除事件

2.3 dom2 级事件处理程序

dom2级事件处理程序 定义了两个方法:addEventListener()removeEventListener()

所有 dom 节点都包含了这两个方法。接收三个参数

  1. 事件名
  2. 处理程序
  3. 布尔值。为 true,捕获阶段调用,false,冒泡阶段调用(默认为false)

2.4 IE 事件处理程序

attachEvent
不介绍,感兴趣自行搜索


tips:
html 事件处理程序带 on
dom0 btn.onclick 带 on
dom2 addEventListener 不带 on


三、事件对象

上述事件处理程序,会传入一个参数 event

div.addEventListener("click", function(event) {
	...
}, false);

event 是一个事件对象,所有属性均为只读属性
function 函数中的 this,指向绑定事件的对象!!!!(好好体会)

event 属性说明
e.target返回触发事件的元素
e.type触发事件类型
e.clientX页面可视区(窗口)
e.pageX页面(含滚动)
e.screenX屏幕窗口
e.stopPropagation()阻止事件捕获或事件冒泡

以上 x 均可换为 y

e.stopPropagation()

<!DOCTYPE html>
<html lang="en">
<head>
   <title>Document</title>
   <style>
       div.a {
           width: 400px;
           height: 400px;
           background-color: pink;
       }
       div.b {
           width: 300px;
           height: 300px;
           background-color: green;
       }
       div.c {
           width: 200px;
           height: 200px;
           background-color: yellow;
       }
       div.d {
           width: 100px;
           height: 100px;
           background-color: blue;
       }
   </style>
</head>
<body>
   <div class="a">
       <div class="b">
           <div class="c">
               <div class="d">

               </div>
           </div>
       </div>
   </div>
   <script>
       var diva = document.querySelector("div.a");
       var divb = document.querySelector("div.b");
       var divc = document.querySelector("div.c");
       var divd = document.querySelector("div.d");

       diva.addEventListener("click", a);
      divb.addEventListener("click", b);
       divc.addEventListener("click", c);
       divd.addEventListener("click", d);

       function a() {
          console.log("a");
       }
       function b(e) {
           console.log("b");
           e.stopPropagation();
       }
       function c() {
           console.log("c");
       }
       function d() {
           console.log("d");
       }
   </script>
</body>
</html>

在这里插入图片描述


四、事件类型

4.1 概述

事件类型分为

  1. UI 事件
  2. 焦点事件
  3. 鼠标事件
  4. 滚轮事件
  5. 文本事件
  6. 键盘事件
  7. 变动事件(mutation):dom 结构变动时触发(不介绍)

4.2 UI 事件

UI 事件 指不一定与用户操作有关的事件。

事件名称说明
load当页面全部加载后在 window 上触发
error当发生 Javascript 错误时在 window 上触发
resize当窗口大小变化时在 window 上触发
scroll当用户滚动带滚动条的元素内容时,在该元素上触发

load
当页面完全加载后(包括图片、js 文件、css文件等外部资源)
window.onload = …
window.addEventListener(“load”, …)

4.3 焦点事件

当页面元素获得或失去焦点时触发 |

事件名称说明
blur元素失去焦点时触发,该事件不会冒泡
focus获得焦点,不会冒泡
focusin等于focus,会冒泡

4.4 鼠标与滚轮事件

事件名称说明
click点击事件
dbclick双击事件
mousedown鼠标按下任意键
mouseup鼠标按下后放开
mousemove鼠标在元素内称动,重复触发
mouseenter鼠标首次移入元素内部
mouseleave鼠标离开
mouseoutmouseleave,会冒泡
mouseovermouseenter,会冒泡

mouseout、mouseover在经过子元素时也会触发

事件名称说明
mousewheel鼠标滚轮事件

mousewheel 触发的 event,会有 wheelDelta
向上滚轮为正,向下为负

4.5 键盘与文本事件

事件名称说明
keydown按下,按住不放会重复触发
keypress按字符键才触发,keydown按所有键都触发
keyup释放按键

键码
发生 keydown 和 keyup 事件时,event 事件的 keyCode 属性会包含按下键的 ascii 码。

4.6 额外补充

html 事件:
DOMContentLoaded 在形成完整 dom 树后触发,可以添加到 document 或 window 上


五、事件委托

当“事件处理程序”太多时,可以通过事件委托减少绑定事件
事件委托 利用了事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件

例如:给 ul 的 li 添加点击事件,可以不给 li 添加,而是给 ul 添加,再判断 event 是哪个点击对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

竹一笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值