javascript自定义事件应用实例
可以先看例子
从 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自定义事件应用实例相关推荐
- Javascript自定义事件功能与用法实例分析
原文地址:https://www.jb51.net/article/127776.htm 本文实例讲述了javascript自定义事件功能与用法.分享给大家供大家参考,具体如下: 概述 自定义事件很难 ...
- JavaScript自定义事件
很多DOM对象都有原生的事件支持,向div就有click.mouseover等事件,事件机制可以为类的设计带来很大的灵活性,相信.net程序员深有体会.随着web技术发展,使用JavaScript自定 ...
- JavaScript自定义事件--高级技巧
观察者模式 事件是JavaScript和浏览器交互的主要途径.事件是一种叫做观察者的设计模式,这是一种创建松散耦合代码的技术. 观察者模式:由两类对象组成,主体和观察者,主体负责发布事件,观察者通过订 ...
- javascript自定义事件原理
我们都知道,鼠标点击click,触屏的touch等事件,可以触发相应的事件处理程序,也可以为这些事件添加事件处理程序,实际开发过程中可供我们使用的事件很少,click.doubleclick,mous ...
- JavaScript 自定义事件、触发事件
1. 自定义事件的基本步骤 创建事件. var event = document.createEvent('Event'); 初始化事件[参数:事件类型.事件是否在DOM中冒泡.是否可以用 preve ...
- 【JS】512- JS 自定义事件如此简单!
在前端开发世界中,JavaScript 和 HTML 之间往往通过 事件 来实现交互.其中多数为内置事件,本文主要介绍 JS自定义事件概念和实现方式,并结合案例详细分析自定义事件的原理.功能.应用及注 ...
- html 自定义js,js 自定义事件
js怎么自定义事件,并能让用on事件监听 你这个问题全部内容应该是如下吧: 在视频播放的时候,能够用on监听事件的触发,如下: player.on('pause',function(){ consol ...
- php鼠标点击事件,javascript模拟鼠标点击事件的实例代码
javascript触发模拟鼠标点击事件 事件触发器就是用来触发某个元素下的某个事件,IE下fireEvent方法,高级浏览器(chrome,firefox等)有dispatchEvent方法. 一般 ...
- Javascript框架的自定义事件(转)
很多 javascript 框架都提供了自定义事件(custom events),例如 jquery.yui 以及 dojo 都支持"document ready"事件.而部分自定 ...
最新文章
- opencv 直线检测笔记
- python下载安装教程3.8.0-Python3.8.0
- Amazon DynamoDB 入门2:工作原理、API和数据类型介绍
- 运维基础(6)CI / CD
- 云炬Android开发教程 Android studio的详细安装步骤
- OpenGL 开发环境配置
- 计算机一级考试word题主要,2017年计算机一级考试word题及答案
- 网络通信tcp与udp的区别
- php post undefined index,PHP 中提示undefined index如何解决(多种方法)
- jQuery中 trigger() 使用心得
- centos7 源码安装redis
- 计算机英语演讲主题ppt模板,英文演讲主题PPT模板
- 查看别人IP经典办法
- ffmpeg推流和拉流rtsp
- 电脑网线,电脑网线主要分类
- Paper Notes: Cross-Domain Image Translation Based on GAN
- 鸡啄米:C++编程入门系列之目录和总结
- 物联网卡是什么?物联网卡有哪些功能?
- JVM(1)——字节码
- 你认为vscode和visual studio哪个好?