可以先看例子


从 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);
})

这个功能非常有用!

使用自定义事件的优缺点

优点: 各模块之间低耦合

缺点:不好定位问题,容易导致诡秘的错误。曾在一个项目上用到自定义事件,大体如下:

let i = 0;
document.addEventListener("EventA",function(){i++;document.dispatchEvent(new Event("EventB"));
})document.addEventListener("EventB",function(){i++;document.dispatchEvent(new Event("EventA")); //这句是不小心多加的 if(true){document.dispatchEvent(new Event("EventC"));}
})document.addEventListener("EventC",function(){i++;console.log("i的值是:",i);
})

你会发现得到一个很怪异的结果,仅仅是多加一句,整个程序的流程就完完全全的改变了,而且很难定位问题。

要解决这种问题,好好的打印日志或许是一个办法。

javascript自定义事件应用实例相关推荐

  1. Javascript自定义事件功能与用法实例分析

    原文地址:https://www.jb51.net/article/127776.htm 本文实例讲述了javascript自定义事件功能与用法.分享给大家供大家参考,具体如下: 概述 自定义事件很难 ...

  2. JavaScript自定义事件

    很多DOM对象都有原生的事件支持,向div就有click.mouseover等事件,事件机制可以为类的设计带来很大的灵活性,相信.net程序员深有体会.随着web技术发展,使用JavaScript自定 ...

  3. JavaScript自定义事件--高级技巧

    观察者模式 事件是JavaScript和浏览器交互的主要途径.事件是一种叫做观察者的设计模式,这是一种创建松散耦合代码的技术. 观察者模式:由两类对象组成,主体和观察者,主体负责发布事件,观察者通过订 ...

  4. javascript自定义事件原理

    我们都知道,鼠标点击click,触屏的touch等事件,可以触发相应的事件处理程序,也可以为这些事件添加事件处理程序,实际开发过程中可供我们使用的事件很少,click.doubleclick,mous ...

  5. JavaScript 自定义事件、触发事件

    1. 自定义事件的基本步骤 创建事件. var event = document.createEvent('Event'); 初始化事件[参数:事件类型.事件是否在DOM中冒泡.是否可以用 preve ...

  6. 【JS】512- JS 自定义事件如此简单!

    在前端开发世界中,JavaScript 和 HTML 之间往往通过 事件 来实现交互.其中多数为内置事件,本文主要介绍 JS自定义事件概念和实现方式,并结合案例详细分析自定义事件的原理.功能.应用及注 ...

  7. html 自定义js,js 自定义事件

    js怎么自定义事件,并能让用on事件监听 你这个问题全部内容应该是如下吧: 在视频播放的时候,能够用on监听事件的触发,如下: player.on('pause',function(){ consol ...

  8. php鼠标点击事件,javascript模拟鼠标点击事件的实例代码

    javascript触发模拟鼠标点击事件 事件触发器就是用来触发某个元素下的某个事件,IE下fireEvent方法,高级浏览器(chrome,firefox等)有dispatchEvent方法. 一般 ...

  9. Javascript框架的自定义事件(转)

    很多 javascript 框架都提供了自定义事件(custom events),例如 jquery.yui 以及 dojo 都支持"document ready"事件.而部分自定 ...

最新文章

  1. opencv 直线检测笔记
  2. python下载安装教程3.8.0-Python3.8.0
  3. Amazon DynamoDB 入门2:工作原理、API和数据类型介绍
  4. 运维基础(6)CI / CD
  5. 云炬Android开发教程 Android studio的详细安装步骤
  6. OpenGL 开发环境配置
  7. 计算机一级考试word题主要,2017年计算机一级考试word题及答案
  8. 网络通信tcp与udp的区别
  9. php post undefined index,PHP 中提示undefined index如何解决(多种方法)
  10. jQuery中 trigger() 使用心得
  11. centos7 源码安装redis
  12. 计算机英语演讲主题ppt模板,英文演讲主题PPT模板
  13. 查看别人IP经典办法
  14. ffmpeg推流和拉流rtsp
  15. 电脑网线,电脑网线主要分类
  16. Paper Notes: Cross-Domain Image Translation Based on GAN
  17. 鸡啄米:C++编程入门系列之目录和总结
  18. 物联网卡是什么?物联网卡有哪些功能?
  19. JVM(1)——字节码
  20. 你认为vscode和visual studio哪个好?

热门文章

  1. Mysql数据库查询当前操作的数据库名
  2. vue-js 特殊变量$event常识
  3. oracle数据导入与导出
  4. linux如何记录测试时长,如何测试Linux命令运行时间?
  5. DTO – 服务实现中的核心数据
  6. c# 操作oracle数据库,C#连接oracle数据库增删改查实例
  7. 信息抽取--新词提取
  8. ansible-plabybook 常用的有用的命令
  9. bzoj3203: [Sdoi2013]保护出题人
  10. BZOJ2302 [HAOI2011]Problem c 【dp】