创建一个事件处理的订阅发布类

  1. /*
  2. * @Descripttion:
  3. * @version: 1.1.1
  4. * @Author: 张三
  5. * @Date: 2021-07-21 15:12:54
  6. * @LastEditors: 李四
  7. * @LastEditTime: 2021-07-21 15:58:56
  8. */
  9. class Event{
  10. constructor(){ }
  11. //存放所有绑定的事件
  12. handlers = {} //处理器
  13. //给事件添加方法,参数type:事件名 handler:事件处理函数
  14. addEventListener(type,handler){
  15. //判断是否存在该事件
  16. if(!(type in this.handlers)){
  17. this.handlers[type] = [];
  18. }
  19. //将事件处理函数添加到该事件处理函数列表内
  20. this.handlers[type].push(handler);
  21. }
  22. //触发事件的方法 type:事件名 payload:参数
  23. dispatchEvent(type,...payload){
  24. if(!(type in this.handlers)){
  25. return new Error('此事件不存在')
  26. }
  27. this.handlers[type].forEach(handler => handler(...payload));
  28. }
  29. //删除事件上的方法
  30. removeEventListener(type,handler){
  31. if(!(type in this.handlers)){
  32. return new Error('此事件不存在');
  33. }
  34. if(!handler){
  35. //不存在handler,默认删除此事件的全部事件处理函数,也就是删除这个事件
  36. delete this.handlers[type];
  37. return '事件绑定移除成功';
  38. }
  39. //找出该事件处理函数在事件函数列表的位置
  40. let ind = this.handlers[type].findIndex(item => item === handler);
  41. //判断是否存在该事件
  42. if(!ind){
  43. return new Error('不存在此事件处理函数');
  44. }
  45. //移除事件
  46. this.handlers[type].splice(ind,1);
  47. //判断事件处理函数列表是否不为空,为空删除该事件
  48. if(!(this.handlers[type].length)){
  49. delete this.handlers[type];
  50. return '事件绑定移除成功';
  51. }
  52. return '事件处理函数移除成功';
  53. }
  54. }

类的使用

  1. var event = new Event() // 创建event实例
  2. // 定义一个自定义事件:"load"
  3. function load (params) {
  4. console.log('load', params)
  5. }
  6. event.addEventListener('load', load)
  7. // 再定义一个load事件
  8. function load2 (params) {
  9. console.log('load2', params)
  10. }
  11. event.addEventListener('load', load2)
  12. // 触发该事件
  13. event.dispatchEvent('load', 'load事件触发')
  14. // 移除load2事件
  15. event.removeEventListener('load', load2)
  16. // 移除所有load事件
  17. event.removeEventListener('load')