怎么用javascript实现自定义事件功能

怎么用javascript实现自定义事件功能

概述

自定义事件很难派上用场?

为什么自定义事件很难派上用场,因为以前js不是模块化开发,也很少协作。因为事件本质是一种通信方式,是一种消息,只有存在多个对象,多个模块的情况下,才有可能需要用到事件进行通信。而现在有了模块化之后,已经可以使用自定义事件进行各模块间协作了。

哪里用得到自定义事件?

事件本质是一种消息,事件模式本质上是观察者模式的实现,那么用得上观察者模式的地方,自然也可以也可以用上事件模式。所以,如果:

1、一个目标对象改变,需要多个观察者调整自身的。

比如:我需要元素A点击之后,元素B显示鼠标的位置,元素C显示提示,元素D…..

2、分模块协作需要解耦的

比如:甲负责模块A,乙负责模块B,模块B需要A运行完之后才能运行

传统的写法将逻辑写在一个方法里面:

function doSomething(){  A();  B();}

这样做每次扩展都要修改a的点击函数,不好扩展。

自定义事件的写法

//1、创建事件var clickElem = new Event("clickElem");//2、注册事件监听器elem.addEventListener("clickElem",function(e){  //干点事})//3、触发事件elem.dispatchEvent(clickElem);

可以看到,elem通过dispatchEvent方法触发的事件,只有elem上注册的监听器才能监听得到。这就很没意思了,自己发给自己消息,通知自己去干什么。

创建自定义事件可参考: MDN : Creating_and_triggering_events

应用

从前面 js 自定义事件 的描述中知道:元素A通过dispatchEvent方法触发的事件,只有A上注册的监听器才能监听得到。

我们想要的效果是,别的对象干了某件事之后, 发个消息给我们,好让我们能做相应的改变。要做到这样,也不是没办法:我们可以在一个公共对象上监听和触发事件,这就很有意义了。

例子一:通知多个对象

要实现 元素A点击之后,元素B显示鼠标的位置,元素C显示提示,可以这样写:

文件:a.js

import b from "./b"import c from "./c"var a = document.getElementById("a");a.addEventListener("click",function(e){  var clickA = new Event("clickA");  document.dispatchEvent(clickA);});

注意:import进来的变量虽然不使用,但是一定不能省略

文件b.js:

var b = document.getElementById("b");document.addEventListener("clickA",function(e){  b.innerHTML = "(128,345)";})

文件c.js:

var c = document.getElementById("c");document.addEventListener("clickA",function(e){  c.innerHTML = "你点了A";})

这样写,三个模块之间完全不用关心对象,也不知道对方存在,耦合度非常的低,完全可以独立编写,不会互相影响。这其实就是一个观察者模式的实现。

例子二:游戏框架

要开发一个游戏,启动游戏,加载图片和音乐,加载完后,渲染场景和音效,加载和渲染由不同的人负责。可以这样写:

文件:index.js

import loadImage from "./loadImage"import loadMusic from "./loadMusic"import initScene from "./initScene"  var start = document.getElementById("start");start.addEventListener("click",function(e){  console.log("游戏开始!");  document.dispatchEvent(new Event("gameStart"));})

文件:loadImage.js

// 加载图片document.addEventListener("gameStart",function(){  console.log("加载图片...");  setTimeout(function(){    console.log("加载图片完成");    document.dispatchEvent(new Event("loadImageSuccess"));  },1000);});

文件:loadMusic.js

//加载音乐document.addEventListener("gameStart",function(){  console.log("加载音乐...");  setTimeout(function(){    console.log("加载音乐完成");    document.dispatchEvent(new Event("loadMusicSuccess"));  },2000);});

文件:initScene.js

//渲染场景document.addEventListener("loadImageSuccess",function(e){  console.log("使用图片创建场景...");  setTimeout(function(){    console.log("创建场景完成");  },2000)});//渲染音效document.addEventListener("loadMusicSuccess",function(e){  console.log("使用音乐创建音效...");  setTimeout(function(){    console.log("创建音效完成");  },500)});

加载模块和渲染模块互不影响,易于扩展。

携带信息

除此之外,事件还能传递自定义信息:

var event = new CustomEvent('myEvent', { 'dataName': dataContent });document.dispatchEvent(event);

(注意:传递自定义信息需要使用CustomEvent,而不是Event)

然后在监听函数里取出:

document.addEventListener("myEvent",function(e){  console.log(e.dataName);})

关于“怎么用javascript实现自定义事件功能”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。

文章标题:怎么用javascript实现自定义事件功能,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/20940

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云亿速云认证作者
上一篇 2022年8月27日 下午4:54
下一篇 2022年8月27日 下午4:55

相关推荐

  • Apache Shiro 1.2.4反序列化漏洞实例分析

    0x00 Apache Shiro 这个组件的漏洞很久之前就爆出来了,但是最近工作中又遇到了,刚好最近也在看Java反序列化的东西,所以决定拿出来再分析一下,期间也遇到了一些奇怪的问题。 网上的分析文章中大部分都是手动添加了commons-collections4-4.0的依赖,目的是为了使用yso…

    2022年9月16日
    28600
  • jquery怎么删除option

    具体步骤如下: 1.首先,新建一个html项目,并在项目中引入jquery; <script type=”text/javascript” src=”/static/jquery-2.1.4.min.js”></script> 2.引入jquery后,在项目中创建一个opti…

    2022年8月29日
    30000
  • SQL中的开窗函数是什么

    OVER的定义 OVER用于为行定义一个窗口,它对一组值进行操作,不需要使用GROUP BY子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列。 OVER的语法 OVER ( [ PARTITION BY column ] [ ORDER BY culumn ] ) PARTITION B…

    2022年9月2日
    41100
  • 笔记本电脑键盘打不出字怎么解决

    笔记本键盘打不出字多种解决方法 名列前茅种方法 1、先按住【Fn键】(Fn键一般在键盘的左下角),再按【Num Lk】(Num Lk一般在右上角,F11键的上面,当然不同的笔记本所在位置有所不同),我们可以按这二个组合键进行字母变数字,这也是最常用的方法。 2、点击【开始】菜单,然后选择【程序】,然…

    2022年9月6日
    3.3K00
  • windows KB4531955安装失败如何解决

    KB4531955安装失败解决方法 方法一: 更新升级最新的.net framework(目前是4.8版本) 方法二: 1.点击开始按钮>输入cmd>右键点击搜索结果中的“命令提示符”>以管理员身份运行 2.在打开的命令提示符窗口中运行: net s较好 w…

    2022年9月1日
    22100
  • word页面变成左右两页怎么调回来

    调回来的方法: 1、首先打开word,然后点击顶部“视图”。 2、此时你可以看到单页选项,然后点击菜单中的“单页”。 3、此时就可以看到页面已经恢复正常了。 4、你也可以在变左右两页时,把右下角的显示比例调成100%来恢复正常。 以上就是“word页面变成左右两页怎么调回来”这篇文章的所有内容,感谢…

    2022年9月19日
    2.6K00
  • Word字体放大如何操作

    Word字体放大的方法 1、首先电脑打开word文档。 2、然后选中自己要放大的文字。 3、选中要放大的文字后,同时按住Ctrl+SHift+>就可以把文字无限放大, 想放多大就可以放多大。 4、选中文字按Ctrl+Shift+<就可以缩小文字 关于“Word字体放大如何操作”这篇文章的…

    2022年9月15日
    97500
  • windows deepin没有无线网络怎么解决

    解决方法: 方法一: 1、可以尝试先切换回windows系统,然后下载驱动人生。 2、然后在windows系统下更新自己的无线网卡驱动,更新后再切换回deepin系统看看能否显示。 方法二: 1、如果windows修复无效,那么回到deepin,打开“深度终端” 2、在其中输入“lspci | gr…

    2022年9月21日
    53100
  • windows softcnkiller怎么使用

    softcnkiller使用方法 1、首先下载这款软件。 2、下载完成后将下载好的压缩包解压出来。 3、解压完成后进入文件夹,运行“softcnkiller.exe” 4、打开后软件会自动扫描你系统之中存在的流氓软件。 5、对于你想要处理的内容,只要选中它,并点击右下角“处理选中” 6、软件逻辑是通…

    2022年9月21日
    28700
  • vlookup函数多条件查找怎么使用

    vlookup函数多条件查找使用方法 方法一: 1、借助“if命令”可以同时筛选多个条件。 2、在这里,我们需要同时满足“姓名”和“工号”两个条件。 3、这时候,我们使用vlookup函数,先选定“E5&F5”作为条件。 4、接着使用if命令,让后面的调节需要满足姓名和工号两个条件。 5、使…

    2022年9月22日
    1.4K00
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部