源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

javascript自定义事件功能与用法实例分析

  • 时间:2020-05-24 04:22 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:javascript自定义事件功能与用法实例分析
本文实例讲述了javascript自定义事件功能与用法。分享给大家供大家参考,具体如下: [b]概述[/b] [b]自定义事件很难派上用场?[/b] 为什么自定义事件很难派上用场,因为以前js不是模块化开发,也很少协作。因为事件本质是一种通信方式,是一种消息,只有存在多个对象,多个模块的情况下,才有可能需要用到事件进行通信。而现在有了模块化之后,已经可以使用自定义事件进行各模块间协作了。 [b]哪里用得到自定义事件?[/b] 事件本质是一种消息,事件模式本质上是观察者模式的实现,那么用得上观察者模式的地方,自然也可以也可以用上事件模式。所以,如果: 1、一个目标对象改变,需要多个观察者调整自身的。 比如:我需要元素A点击之后,元素B显示鼠标的位置,元素C显示提示,元素D..... 2、分模块协作需要解耦的 比如:甲负责模块A,乙负责模块B,模块B需要A运行完之后才能运行 传统的写法将逻辑写在一个方法里面:
function doSomething(){
  A();
  B();
}

这样做每次扩展都要修改a的点击函数,不好扩展。 [b]自定义事件的写法[/b]
//1、创建事件
var clickElem = new Event("clickElem");
//2、注册事件监听器
elem.addEventListener("clickElem",function(e){
  //干点事
})
//3、触发事件
elem.dispatchEvent(clickElem);

可以看到,elem通过dispatchEvent方法触发的事件,只有elem上注册的监听器才能监听得到。这就很没意思了,自己发给自己消息,通知自己去干什么。 创建自定义事件可参考: MDN : [url=https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events]Creating_and_triggering_events[/url] [b]应用[/b] 从前面 js 自定义事件 的描述中知道:元素A通过dispatchEvent方法触发的事件,只有A上注册的监听器才能监听得到。 我们想要的效果是,别的对象干了某件事之后, 发个消息给我们,好让我们能做相应的改变。要做到这样,也不是没办法:我们可以在一个公共对象上监听和触发事件,这就很有意义了。 [b]例子一:通知多个对象[/b] 要实现 元素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";
})

这样写,三个模块之间完全不用关心对象,也不知道对方存在,耦合度非常的低,完全可以独立编写,不会互相影响。这其实就是一个观察者模式的实现。 [b]例子二:游戏框架[/b] 要开发一个游戏,启动游戏,加载图片和音乐,加载完后,渲染场景和音效,加载和渲染由不同的人负责。可以这样写: 文件: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)
});

加载模块和渲染模块互不影响,易于扩展。 [b]携带信息[/b] 除此之外,事件还能传递自定义信息:
var event = new CustomEvent('myEvent', { 'dataName': dataContent });
document.dispatchEvent(event);

(注意:传递自定义信息需要使用CustomEvent,而不是Event) 然后在监听函数里取出:
document.addEventListener("myEvent",function(e){
  console.log(e.dataName);
})

这个功能非常有用! [b]附:[/b]点击此处查看[url=https://github.com/chunnallu/chunnallu.github.io/tree/master/share/projects/js/js%E9%80%9A%E8%BF%87%E8%87%AA%E5%AE%9A%E4%B9%89%E4%BA%8B%E4%BB%B6%E8%A7%A3%E8%80%A6%E6%A8%A1%E5%9D%97%E4%BE%8B%E5%AD%90][b]github示例[/b][/url] [b]PS:这里再为大家附上javascript系统自带事件参考表供大家参考查询:[/b] [b]javascript事件与功能说明大全: [/b][url=http://tools.jb51.net/table/javascript_event]http://tools.jb51.net/table/javascript_event[/url] 更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《[url=http://www.1sucai.cn/Special/892.htm]JavaScript事件相关操作与技巧大全[/url]》、《[url=http://www.1sucai.cn/Special/332.htm]JavaScript操作DOM技巧总结[/url]》、《[url=http://www.1sucai.cn/Special/439.htm]JavaScript错误与调试技巧总结[/url]》、《[url=http://www.1sucai.cn/Special/297.htm]JavaScript数据结构与算法技巧总结[/url]》、《[url=http://www.1sucai.cn/Special/281.htm]JavaScript遍历算法与技巧总结[/url]》及《[url=http://www.1sucai.cn/Special/119.htm]JavaScript数学运算用法总结[/url]》 希望本文所述对大家JavaScript程序设计有所帮助。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部