原文地址:https://www.jb51.net/article/127776.htm

本文实例讲述了javascript自定义事件功能与用法。分享给大家供大家参考,具体如下:

概述

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

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

哪里用得到自定义事件?

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

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

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

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

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

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

?
1
2
3
4
function doSomething(){
  A();
  B();
}

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

自定义事件的写法

?
1
2
3
4
5
6
7
8
//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

?
1
2
3
4
5
6
7
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:

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

文件c.js:

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

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

例子二:游戏框架

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

文件:index.js

?
1
2
3
4
5
6
7
8
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

?
1
2
3
4
5
6
7
8
// 加载图片
document.addEventListener("gameStart",function(){
  console.log("加载图片...");
  setTimeout(function(){
    console.log("加载图片完成");
    document.dispatchEvent(new Event("loadImageSuccess"));
  },1000);
});

文件:loadMusic.js

?
1
2
3
4
5
6
7
8
//加载音乐
document.addEventListener("gameStart",function(){
  console.log("加载音乐...");
  setTimeout(function(){
    console.log("加载音乐完成");
    document.dispatchEvent(new Event("loadMusicSuccess"));
  },2000);
});

文件:initScene.js

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//渲染场景
document.addEventListener("loadImageSuccess",function(e){
  console.log("使用图片创建场景...");
  setTimeout(function(){
    console.log("创建场景完成");
  },2000)
});
//渲染音效
document.addEventListener("loadMusicSuccess",function(e){
  console.log("使用音乐创建音效...");
  setTimeout(function(){
    console.log("创建音效完成");
  },500)
});

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

携带信息

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

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

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

然后在监听函数里取出:

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

这个功能非常有用!

附:点击此处查看github示例

PS:这里再为大家附上javascript系统自带事件参考表供大家参考查询:

javascript事件与功能说明大全:
http://tools.jb51.net/table/javascript_event

转载于:https://www.cnblogs.com/boonya/p/11165024.html

Javascript自定义事件功能与用法实例分析相关推荐

  1. trait功能 php,PHP之Trait功能与用法实例分析

    本文实例讲述了PHP Trait功能与用法.分享给大家供大家参考,具体如下: Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制. 1.如果引入的Trait有同名的方法trait A{ ...

  2. mysql 自定义函数实例_mysql自定义函数原理与用法实例分析

    本文实例讲述了mysql自定义函数原理与用法.分享给大家供大家参考,具体如下: 本文内容: 什么是函数 函数的创建 函数的调用 函数的查看 函数的修改 函数的删除 首发日期:2018-04-18 什么 ...

  3. Cocos Analytics 自定义事件功能介绍

    在版号政策限制下,国内游戏开发者纷纷开始寻求更多出路,游戏出海是其中之一,而出海游戏最重要的变现方式便是广告.此外,由于小游戏上线广告仅需软著尚未要求版号,因此各个小游戏厂商近期都开始尝试挖掘广告变现 ...

  4. python asyncio回调函数_python回调函数用法实例分析

    python回调函数用法实例分析 本文实例讲述了python回调函数用法.分享给大家供大家参考.具体分析如下: 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步 ...

  5. PHP - 回调函数概念与用法实例分析 - 学习/实践

    1.应用场景 主要用于理解回调函数的概念, 对比JavaScript中的回调函数, 更加深刻理解回调函数的本质, 以及如何高效使用~~~ 2.学习/操作 1. 文档阅读 https://www.jb5 ...

  6. python中max函数用法_Python中max函数用法实例分析

    Python中max函数用法实例分析 更新时间:2015年07月17日 15:45:09 作者:优雅先生 这篇文章主要介绍了Python中max函数用法,实例分析了Python中max函数的功能与使用 ...

  7. php 类常量用法,php类常量用法实例分析

    这篇文章主要介绍了php类常量用法,实例分析了php中类常量的概念.特性与相关使用技巧,需要的朋友可以参考下 本文实例讲述了php类常量用法.分享给大家供大家参考.具体如下: '; echo Foo: ...

  8. python中event的用法_Python编程之event对象的用法实例分析

    本文实例讲述了Python编程中event对象的用法.分享给大家供大家参考,具体如下: Python提供了Event对象用于线程间通信,它是由线程设置的信号标志,如果信号标志位为假,则线程等待直到信号 ...

  9. python中property函数_python 邮件表格Python中property函数用法实例分析

    本文实例讲述了Python中property函数用法.分享给大家供大家参考,具体如下: 通常我们在访问和赋值属性的时候,都是在直接和类(实例的)的__dict__打交道,或者跟数据描述符等在打交道.但 ...

最新文章

  1. Windows如此普及,为什么要学Linux
  2. [BUAA软工]提问回顾与个人总结
  3. 如果今天完成,ESB会是什么样子?
  4. 【Socket】关于socket长连接的心跳包
  5. 对象的自身引用(Self-Reference) 动态绑定(Dynamic Binding)
  6. 用VB无窗口透明Usercontrol编写透明浮动按钮
  7. python常用的十进制、16进制、字符串、字节串之间的转换
  8. E - What Is Your Grade?
  9. 剑圣一族x8鼠标驱动v1.21加强版
  10. Ubuntu环境下利用Stress对CPU进行满载及半载压力测试
  11. 用Python输出100以内的质数
  12. 计算机专业本科生必学课程
  13. Overfeat论文笔记
  14. android基础之Map系列
  15. springboot整合微信网页授权登陆
  16. google工具栏新览
  17. Latex文献报错 Something‘s wrong--perhaps a missing \item. \end{thebibliography}
  18. 底层小程序员 练手做一个网站不小心赚了几十亿
  19. hazelcast配置内存_在内存数据网格中引入hazelcast imdg
  20. iPhone与iPad开发实战读书笔记

热门文章

  1. Maven搭建springMVC+spring+hibernate环境
  2. 演练3-1:留言管理系统的制作
  3. OpenCV2学习笔记(一)
  4. [置顶] 显示/隐藏登录密码
  5. ISO9000管理体系认证申请书
  6. 池化方法总结(Pooling)
  7. 港府拟修例禁止电子烟入口及销售 保障市民健康
  8. HAProxy详解(二):HAProxy基础配置与应用实例
  9. git 分支合并到当前
  10. shell中(字符串截取)