javascript自定义事件功能与用法实例分析(2)
文件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);
})
这个功能非常有用!
附:点击此处查看github示例
PS:这里再为大家附上javascript系统自带事件参考表供大家参考查询:
