观察者模式

事件是JavaScript和浏览器交互的主要途径。事件是一种叫做观察者的设计模式,这是一种创建松散耦合代码的技术。
观察者模式:由两类对象组成,主体观察者,主体负责发布事件,观察者通过订阅这些事件来观察主体。该模式的一个重要概念是主体并不知道观察者的任何事情,也就是说即使观察者不存在,主体也可以独自存在并正常运作。而观察者知道主体,并能注册事件的回调函数。
示例:当涉及DOM时,DOM元素便是主体,事件处理代码便是观察者。

自定义事件

事件是与DOM交互的最常见的方式。通过实现自定义事件,可以让事件用于非DOM代码中。
思想:创建一个管理事件的对象,让其他对象监听那些事件。

基本模式:

function EventTarget(){this.handlers = {};
}EventTarget.prototype = {constructor:EventTarget,addHandler:function(type,handler){if(typeof this.handlers[type] === "undefined"){this.handlers[type] = [];}this.handlers[type].push(handler);},fire:function(event){if(!event.target){event.target = this;}if(this.handlers[event.type] instanceof Array){const handlers = this.handlers[event.type];handlers.forEach((handler)=>{handler(event);})}},removeHandler:function(type,handler){if(this.handlers[type] instanceof Array){const handlers = this.handlers[type];for(var i = 0,len = handlers.length; i < len; i++){if(handlers[i] === handler){break;}}handlers.splice(i,1);}}
}

EventTarget类型有一个单独的属性handlers,用于存储事件处理程序(观察者)。还有三个方法:addHandler()用于注册给定类型事件的事件处理程序;fire()用于触发一个事件;removeHandler()用于注销某个事件类型的事件处理程序。

使用EventTarget类型自定义事件:

function handleMessage(event){console.log("message received:"+event.message);
}
//创建一个新对象
var target = new EventTarget();
//添加一个事件处理程序
target.addHandler("message",handleMessage);
//触发事件
target.fire({type:"message",message:"Hello World"});
//删除事件处理程序
target.removeHandler("message",handleMessage);
//再次触发事件,应没有事件处理程序
target.fire({type:"message",message:"Hello World"});

上述功能是封装在一个自定义类型中,其他对象可以通过继承EventTarget获得这个行为。
如下:

function Person(name,age){EventTarget.call(this);this.name = name;this.age = age;
}
inheritPrototype(EventTarget,Person);Person.prototype.say = function(message){this.fire({type:"message",message:message});
}

上述例子中使用的继承方式为:寄生组合继承,详情可以查看
JavaScript继承实现方式。
下面我们举例说明一下上面定义的Person如何使用:

function handleMessage(event){console.log(event.target.name + "says" + event.message);
}
//创建新Personvar person = new Person("James",28);//添加事件处理程序person.addHandler("message",handleMessage);//在person对象上条用say方法,触发消息事件person.say("Hi there");

用处:
使用自定义对象,有助于解耦合相关对象,保持功能的隔绝。在很多情况下,触发事件的代码和监听事件的代码是完全分离的。

JavaScript自定义事件--高级技巧相关推荐

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

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

  2. JavaScript自定义事件

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

  3. javascript自定义事件原理

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

  4. javascript自定义事件应用实例

    可以先看例子 从 js 自定义事件 里知道:元素A通过dispatchEvent方法触发的事件,只有A上注册的监听器才能监听得到. 我们想要的效果是,别的对象干了某件事之后, 发个消息给我们,好让我们 ...

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

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

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

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

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

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

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

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

  9. 如何在JavaScript中使用自定义事件

    2019独角兽企业重金招聘Python工程师标准>>> JavaScript 的事件处理是所有浏览器端程序的基本必备技巧.当目标元素的事件被触发时,比如按钮被点击,鼠标移动,或者是表 ...

最新文章

  1. 2.2 Java的基本数据类型
  2. php关注 取消关注事件,微信公众平台开发关注/取消关注事件例子
  3. PAT 1013 数素数 (20)
  4. LeetCode 113. Path Sum II
  5. 【java奇思妙想】使用多线程的思想来实现java网络编程接收和发送的问题
  6. 242.有效的字母异位词(力扣leetcode) 博主可答疑该问题
  7. STM32应用笔记分类汇总,值得收藏
  8. 硬盘盘符拒绝访问-问题和解决办法
  9. ps投影怎么做之教程:人像投影和物体长投影制作
  10. 华美天气(数据来源:和风天气 API)
  11. 【Vue.js】Vue.js中常用的UI组件库和Vue Router
  12. # Java 并发编程的艺术(二)
  13. garch dcc用matlab,MRS DCC GARCH 模型的MATLAB 程序修改
  14. windows环境下安装python安装pygame安装
  15. lyapunov直接法
  16. 探讨魔兽dota改建原理
  17. Photoshop 快速抠图:使用快速选择工具
  18. 准备工作(正则表达式学习)
  19. Spring Cloud——断路器Hystrix
  20. 阿里云智能总裁、达摩院院长张建锋2020云栖大会最新完整版演讲全文

热门文章

  1. Python利用meteinfo来计算后向轨迹
  2. 渗透测试 跨站攻击手法剖析
  3. 震网(Stuxnet)病毒深度解析:首个攻击真实世界基础设施的病毒
  4. [已解决]解决小米云下载JPG格式微博照片格式无法打开问题
  5. Gstreamer学习笔记(4):pad定义、连接、流动
  6. kernel 加载用户空间fw实现原理
  7. 怎么把Excel转换成Word文档?一分钟就能教会你
  8. android 跳转崩溃_iOS系统突现大量bug! 英雄联盟手游配置需求公布、iOS13.5全设备越狱到来、三星手机系统崩溃...
  9. 数字信号处理5——CFAR算法及matlab实现
  10. 当《超级玛丽》中马里奥得罪程序员时,只能猜到开始,结局难测!