前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >22 - 23 - 24 事件相关

22 - 23 - 24 事件相关

作者头像
前端黑板报
发布于 2022-12-01 08:57:46
发布于 2022-12-01 08:57:46
91700
代码可运行
举报
文章被收录于专栏:前端黑板报前端黑板报
运行总次数:0
代码可运行

事件和事件处理

原文地址:https://dev.to/bhagatparwinder/events-event-handling-f28

事件

你对动作(系统的或用户产生的)的响应就是调用一个事件,对事件的回应就是调用一个事件处理程序。

例如,当用户点击一个按钮后,我们可能会显示一个带信息的弹框,在这个例子中,事件是 click 处理结果就是展示一个弹框。

网页上会发生很多事件:

  1. 1. 用户 hover 一个元素上
  2. 2. 表单的提交
  3. 3. 视频停止播放
  4. 4. 用户从一个图片上滚动过去
  5. 5. 改变浏览器的大小
  6. 6. 按键
  7. 7. 文档加载结束

事件处理程序

我上面已经简单提到过,事件处理程序就是我们如何响应事件的方法。它是事件发生时执行的一块代码。

我们经常会把 event listenersevetn handlers 交替使用,同样你也可以像这样随意使用。

可是,它俩有点小区别,listeners 是监听一个事件的发生而 handler 是执行的具体代码。

案例

假设我们的页面有一个按钮。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<button class="btn-primary">Click Me!</button>

我们为按钮绑定了一个事件,当点击它时打印一条消息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const myButton = document.querySelector(".btn-primary");

myButton.addEventListener("click", function() {
    console.log("The button was clicked");
});

发生了什么:

  1. 1. 我们使用 querySelector获取到浏览器 DOM 中的按钮;
  2. 2. 接着我们使用 addEventListener 添加了事件侦听器;
  3. 3. addEventListner 接受了两个参数(实际可以接受三个参数);
  4. 4. 第一个参数是事件类型,这个例子中的事件类型是 click;
  5. 5. 第二个参数就是一旦点击时执行的回调函数

浏览器知道用户什么时候点击了按钮,同时为有类名 btn-primary 的按钮注册了一个事件,然后执行相关的事件处理程序,将会打印:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
The button was clicked

回调方法是一个匿名函数,它不能被其它地方引用。我们不经常使用匿名函数,可以创建一个命名函数然后传递给它。命名函数是可重用性的首选,它使我们能够在以后删除事件侦听器。

使用命名函数

事件处理器可以是一个命名函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const myButton = document.querySelector(".btn-primary");

const handleClick = function() {
    console.log("The button was clicked");
};

myButton.addEventListener("click", handleClick);

这样并不仅仅是代码更简洁,它还有两个优点:

  1. 1. 重用性:设想你有很多按钮需要打印相同的语句,一个命名函数可以被使用多次而不要写重复的代码。
  2. 2. 移出事件侦听器:使用 removeEventListener 来移出事件处理程序,为了移出它需要传递两个关键参数。第一个是实际类型,第二个是事件处理程序。若事件处理程序是一个匿名函数我们无法指定第二个参数。在这个例子中是命名函数,我们可以这样做:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
myButton.removeEventListener("click", handleClick);

事件冒泡

原文地址:https://dev.to/bhagatparwinder/event-bubbling-pb3

简介

上面我们谈了事件和事件处理程序,以及为事件添加事件处理程序。当事件发生时事件处理程序将会被调用。

JavaScript 中的事件冒泡是指当元素上发生一个事件时,关联的事件处理程序会被调用,紧接着是父级元素和更上层元素的事件处理程序也会被调用。

例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div onclick="alert('Click Event Happened')">
    <p>If you have click this paragraph in the browser, the onclick handler of the div will get invoked.</p>
</div>

上面的例子是:点击 p 标签内的文本时,会触发 div 上的 onclick 事件。这就是 p 上发生的事件冒泡到了 div 上。

即使有 n 多层嵌套的元素上面的模式依旧也会发生。

例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<span onclick="alert('Span Clicked')">
    <div onclick="alert('Div Clicked')">
        <p onclick="alert('Paragraph Clicked')">Click Me.</p>
    </div>
</span>

若我们点击了 p 标签,浏览器会触发三次弹框。

找到事件的源头元素

当事件冒泡经过多层时,很难追踪到是哪个元素产生了这一串的事件。可是 JavaScript 中很容易做到。

像上面的例子,若我们点击了 p 标签,targetevent.target 将会指向它,无论事件冒泡了多少层,而 event.target 永远不会改变,指向事件产生的源头。

如何阻止事件冒泡?

冒泡的事件将一直传递到 <html> 元素,有些还会到 document,其中一些进入window对象。

我们如果不想父级元素的事件发生,可以使用 event.stopPropagation()

例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div onclick="alert('This will not alert')">
  <button onclick="event.stopPropagation()">Click me</button>
</div>

若我们点击了带有 stopPropagation()的按钮,div 的事件处理程序或 alert 不会触发。

如何阻止同一个元素上的多个事件?

有时候我们会为同一个元素绑定同一个事件绑定多个事件处理程序,有时候期望阻止冒泡也想后面注册的同类型事件也被阻止,event.stopImmediatePropagation() 就可以做到。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  <div onclick="alert(1)">
    <div onclick="alert(2)">
      <div id="target">ppp</div>
    </div>
  </div>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let target = document.querySelector('#target')

function testClick1(event){
  alert(33)
}

function testClick2(event){
  alert(44)
  event.stopImmediatePropagation()
  //event.stopPropagation()
}


function testClick3(){
  alert(55)
}

function moveHandler(){
  alert('move')
}


target.addEventListener('click',testClick1)

target.addEventListener('click',testClick2)

target.addEventListener('click',testClick3)

上面会依次弹出:33,44,若把上面的注释换一下则依次弹出:33,44,55

在线案例:https://jsbin.com/xilorahomi/edit?html,js,output

参考文档:http://developer.mozilla.org/en-US/docs/Web/API/Event/stopImmediatePropagation

为何阻止事件冒泡可能会是错误的?

如果用户点击的元素事件处理程序带有stopPropagation() , document 上的点击事件处理程序(为了跟踪、分析或调用弹框)也不会被触发。所以谨慎的阻止事件冒泡。这个仅仅是一个例子,还有许多其它的副作用。

事件冒泡的例外情况

并不是所有的事件都会冒泡,任何与特定元素绑定事件不会冒泡,如下一些事件:

  • • load
  • • unload
  • • focus
  • • blur

事件捕获

原文地址:https://dev.to/bhagatparwinder/event-capturing-40o

事件捕获刚好和事件冒泡相反,事件冒泡中事件是从最内层元素逐渐向外扩散,而事件捕获则是从最外面元素向内直到目标元素。

事件捕获很少用到,开启事件捕获可以给 addEvenListener 传递第三个参数。

例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const myButton = document.querySelector(".btn-primary");

myButton.addEventListener("click", function() {
    console.log("The button was clicked");
}, { capture : true });

第三个参数设置为 true 来开启捕获,现在当一个事件发生时,它会从顶部一直向内流到目标元素,之后事件再冒泡。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div id="p">
  <div id="m">
    <div id="c">Bubble and Capture</div>
  </div>
</div>

上面的结构只在最内层的事件开启捕获也是不行的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let p = document.querySelector('#p')
let m = document.querySelector('#m')
let c = document.querySelector('#c')

p.addEventListener('click',function(e){
  alert(e.eventPhase)
  alert('p')
})

m.addEventListener('click',function(e){
  alert(e.eventPhase)
  alert('m')
})

c.addEventListener('click',function(e){
  alert(e.eventPhase)
  alert('c')
},true)

结果一次弹出:2,c,3,m,3,p 其实还是冒泡的顺序,只有都加上或外面两层的事件加上才会有捕获的效果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let p = document.querySelector('#p')
let m = document.querySelector('#m')
let c = document.querySelector('#c')

p.addEventListener('click',function(e){
  alert(e.eventPhase)
  alert('p')
},true)

m.addEventListener('click',function(e){
  alert(e.eventPhase)
  alert('m')
},true)

c.addEventListener('click',function(e){
  alert(e.eventPhase)
  alert('c')
})

弹框结果:1,p,1,m,2,c,若只给中间的开启捕获呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let p = document.querySelector('#p')
let m = document.querySelector('#m')
let c = document.querySelector('#c')

p.addEventListener('click',function(e){
  alert(e.eventPhase)
  alert('p')
})

m.addEventListener('click',function(e){
  alert(e.eventPhase)
  alert('m')
},true)

c.addEventListener('click',function(e){
  alert(e.eventPhase)
  alert('c')
})

结果:1,m,2,c,3,p

16520216389621

实例:https://jsbin.com/wurabalaje/edit?html,js,output,在案例里来回切换一下true 再对照上图理解。

第三个参数并不一定要是一个对象,是一个 boolean 值 true 也行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
myButton.addEventListener("click", function() {
    console.log("The button was clicked");
}, true);

总结,DOM 事件有三个阶段:

  1. 1. 捕获
  2. 2. 目标元素
  3. 3. 冒泡

通过 event.eventPhase 可以确定我们所处的阶段或在哪个事件处理程序中。

注意:若addEventListener中为了捕获使用了 true,那removeEventListener时也要使用相同的值。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-08-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端黑板报 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[Keras深度学习浅尝]实战一·DNN实现Fashion MNIST 数据集分类
Fashion-MNIST是一个替代MNIST手写数字集的图像数据集。 它是由Zalando(一家德国的时尚科技公司)旗下的研究部门提供。其涵盖了来自10种类别的共7万个不同商品的正面图片。Fashion-MNIST的大小、格式和训练集/测试集划分与原始的MNIST完全一致。60000/10000的训练测试数据划分,28x28的灰度图片。你可以直接用它来测试你的机器学习和深度学习算法性能,且不需要改动任何的代码。
小宋是呢
2019/06/27
1.2K0
[Keras深度学习浅尝]实战一·DNN实现Fashion MNIST 数据集分类
【动手学深度学习笔记】之图像分类数据集(Fashion-MNIST)
这个数据集是我们在后面学习中将会用到的图形分类数据集。它的图像内容相较于手写数字识别数据集MINIST更为复杂一些,更加便于我们直观的观察算法之间的差异。
树枝990
2020/08/20
3.7K0
【动手学深度学习笔记】之图像分类数据集(Fashion-MNIST)
Basic classification: Classify images of clothing
This guide trains a neural network model to classify images of clothing, like sneakers and shirts.
XianxinMao
2021/07/27
4020
终版API已定型,TensorFlow 2.0 Beta蜕变归来
TensorFlow 发布以来,已经成为全世界最广泛使用的深度学习库。但 Tensorflow 1.x 时代最广受诟病的问题是:学习门槛较高、API 重复且复杂、模型部署和使用不够方便。之后,谷歌下定决心改变这一问题,在今年早些时候,发布了 Tensorflow 2.0 的 Alpha 版本。Alpha 版本一经问世,便受到深度学习研究者、开发者和在校学生的好评,其简洁的 API 和快速易上手的特性吸引了更多用户的加入。今天,Tensorflow 官方发布了 2.0 时代的 Beta 版本,标志着 Tensorflow 这一经典的代码库进一步成熟。
AI算法与图像处理
2019/06/14
7420
终版API已定型,TensorFlow 2.0 Beta蜕变归来
TensorFlow从1到2(四)时尚单品识别和保存、恢复训练数据
在TensorFlow官方新的教程中,第一个例子使用了由MNIST延伸而来的新程序。 这个程序使用一组时尚单品的图片对模型进行训练,比如T恤(T-shirt)、长裤(Trouser),训练完成后,对于给定图片,可以识别出单品的名称。
俺踏月色而来
2019/04/22
7250
TensorFlow从1到2(四)时尚单品识别和保存、恢复训练数据
使用tensorflow创建一个简单的神经网络
本文是对tensorflow官方入门教程的学习和翻译,展示了创建一个基础的神经网络模型来解决图像分类问题的过程。具体步骤如下
生信修炼手册
2021/07/06
1.1K0
使用tensorflow创建一个简单的神经网络
小白学PyTorch | 15 TF2实现一个简单的服装分类任务
之前的15节课的pytorch的学习,应该是让不少朋友对PyTorch有了一个全面而深刻的认识了吧 (如果你认真跑代码了并且认真看文章了的话) 。
机器学习炼丹术
2020/10/15
9020
小白学PyTorch | 15 TF2实现一个简单的服装分类任务
【TensorFlow2.x 实践】服装分类
基于TensorFlow2.x的框架,使用PYthon编程语言,实现对服装图像进行分类。
润森
2022/09/22
8040
【TensorFlow2.x 实践】服装分类
[MXNet逐梦之旅]练习四·使用MXNetFashionMNIST数据集分类简洁实现
[MXNet逐梦之旅]练习四·使用MXNetFashionMNIST数据集分类简洁实现 code #%% import sys import time from mxnet import gluon as gl import mxnet as mx from matplotlib import pyplot as plt from mxnet import autograd, nd import numpy as np mnist_train = gl.data.vision.FashionMNIST(r
小宋是呢
2019/06/27
6010
毕业设计(基于TensorFlow的深度学习与研究)之完结篇
本文是我的毕业设计基于TensorFlow的深度学习与研究的完结篇,在本篇推文中,我将分为三个部分去写:
石璞东
2020/04/21
4.6K0
毕业设计(基于TensorFlow的深度学习与研究)之完结篇
从零开始学TensorFlow【01-搭建环境、HelloWorld篇】
最近在学习TensorFlow的相关知识,了解了TensorFlow一些基础的知识,现在周末有空了,就写写一些笔记,记录一下自己的成长~
Java3y
2019/08/27
8190
从零开始学TensorFlow【01-搭建环境、HelloWorld篇】
针对时尚类MINIST数据集探索神经网络
fashion MNIST数据集可以从Github获取。它包含10种类别的灰度图像,共7000个,每个图像的分辨率均为28x28px。下图以25张带有标签的图片向我们展示了该数据集中的数据。
AI研习社
2019/05/14
1.2K0
MNIST终结者:Fashion-MNIST
8月27日,Fashion-MNIST图片库在GitHub上开源,MNIST的时代宣告终结。 这不是巧合,而是Fashion-MNIST蓄谋已久。它克隆了MNIST的所有外在特征: 60000张训练图像和对应Label; 10000张测试图像和对应Label; 10个类别; 每张图像28x28的分辨率; 4个GZ文件名称都一样; 对于已有的MNIST训练程序,只要修改下代码中的数据集读取路径,或者残暴的用Fashion-MNIST数据集文件将MNIST覆盖,替换就瞬间完成了。 不同的是,Fashion-MN
袁承兴
2018/04/11
1.1K0
MNIST终结者:Fashion-MNIST
MOOC TensorFlow入门实操课程代码回顾总结(一)
0 T-shirt/top(体恤) 1 Trouser(裤子) 2 Pullover(套头衫) 3 Dress(连衣裙) 4 Coat(外套) 5 Sandal(凉鞋) 6 Shirt(衬衫) 7 Sneaker(运动鞋) 8 Bag(袋子) 9 Ankle boot(短靴)
荣仔_最靓的仔
2022/01/05
7340
MOOC TensorFlow入门实操课程代码回顾总结(一)
[MXNet逐梦之旅]练习三·使用MXNetFashionMNIST数据集分类手动实现
[MXNet逐梦之旅]练习三·使用MXNetFashionMNIST数据集分类手动实现 code #%% import sys import time from mxnet import gluon as gl import mxnet as mx from matplotlib import pyplot as plt from mxnet import autograd, nd import numpy as np mnist_train = gl.data.vision.FashionMNIST(r
小宋是呢
2019/06/27
4240
TensorFlow Serving
TensorFlow Serving[1] 可以快速部署 Tensorflow 模型,上线 gRPC 或 REST API。
GoCoding
2021/05/06
5820
TensorFlow Serving
TensorFlow 2.0 Tutorial: 4 - 几个常用技术
下面这个过程是一个最基础的模型建立到评估到预测的流程, 几乎都是遵循这样的一个过程,
杨熹
2019/04/22
5640
Pytorch 基于VGG-16的服饰识别(使用Fashion-MNIST数据集)
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的博客 🍊个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 🥭本文内容:Pytorch 基于VGG的服饰识别(使用Fashion-MNIST数据集) 更多内容请见👇 Python sklearn实现K-means鸢尾花聚类 Pytorch 基于LeNet的手写数字识别 Pytorch 基于AlexNet的服饰识别(使用Fashion-MNIST数据集) ---- 本文目录 介绍 1
小嗷犬
2022/11/15
1.3K1
Pytorch 基于VGG-16的服饰识别(使用Fashion-MNIST数据集)
Pytorch 基于ResNet-18的服饰识别(使用Fashion-MNIST数据集)
✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的博客 🍊个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 🥭本文内容:Pytorch 基于ResNet-18的服饰识别(使用Fashion-MNIST数据集) 更多内容请见👇 Pytorch 基于AlexNet的服饰识别(使用Fashion-MNIST数据集) Pytorch 基于VGG-16的服饰识别(使用Fashion-MNIST数据集) Pytorch 基于NiN的服饰识别
小嗷犬
2022/11/15
1K0
Pytorch 基于ResNet-18的服饰识别(使用Fashion-MNIST数据集)
动手学深度学习(一)——逻辑回归(从零开始)
版权声明:博客文章都是作者辛苦整理的,转载请注明出处,谢谢! https://blog.csdn.net/Quincuntial/article/details/79298122
Tyan
2019/05/25
3860
推荐阅读
相关推荐
[Keras深度学习浅尝]实战一·DNN实现Fashion MNIST 数据集分类
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验