当前位置:   article > 正文

发布订阅代码

订阅动作代码是什么

发布就是触发事件,例如node中的emitter.emit ,订阅就是绑定那个事件比如emitter.on。在jq中on绑定clink事件,就是类似订阅,当click就是发布了。
自己怎么实现呢,就是把订阅的事件,比如a,b两个事件,保存在一个对象中,当发布时,取是保存了事件,执行。

  1. class PubSub {
  2. constructor() {
  3. this.handlers = {};
  4. }
  5. on(eventType, handler) {
  6. //订阅
  7. if (!(eventType in this.handlers)) {
  8. this.handlers[eventType] = [];
  9. }
  10. this.handlers[eventType].push(handler);
  11. }
  12. emit(eventType, ...args) {
  13. //发布
  14. for (let i = 0; i < this.handlers[eventType].length; i++) {
  15. this.handlers[eventType][i].apply(this, args);
  16. }
  17. return this;
  18. }
  19. }
  20. var pubsub = new PubSub();
  21. pubsub.on('A',function(data){
  22. console.log(1 + data); // 执行第一个回调业务函数
  23. });
  24. pubsub.on('A',function(data){
  25. console.log(2 + data); // 执行第二个业务回调函数
  26. });
  27. // 触发事件A
  28. pubsub.emit('A',"我是参数");

在浏览器中的实现

  1. function DefineEvent(element) {
  2. this.init(element);
  3. }
  4. DefineEvent.prototype = {
  5. constructor: DefineEvent,
  6. init: function(element) {
  7. this.element = (element && element.nodeType == 1) ? element : document;
  8. return this;
  9. },
  10. /*
  11. * 添加监听事件 * @param {string} type 监听的事件类型
  12. * @param {Function} callback 回调函数
  13. */
  14. addEvent: function(type,callback) {
  15. var self = this;
  16. if(self.element.addEventListener) { // 标准浏览器下
  17. self.element.addEventListener(type,callback,false);
  18. }else if(self.element.attachEvent){ // IE
  19. if(isNaN(self.element[type])) {
  20. self.element[type] = 0;
  21. }
  22. var fun = function(evt){
  23. evt = evt ? evt : window.event;
  24. if(evt.propertyName == type) {
  25. callback.call(self.element);
  26. }
  27. }
  28. self.element.attachEvent('onpropertychange',fun);
  29. // 在元素上存储绑定回调,方便移除事件绑定
  30. if(!self.element['callback' + callback]) {
  31. self.element['callback' + callback] = fun;
  32. }
  33. }else {
  34. self.element.attachEvent('on' + type,callback);
  35. }
  36. return self;
  37. },
  38. /*
  39. * 移除事件
  40. * @param {string} type 监听的事件类型
  41. * @param {Function} callback 回调函数
  42. */
  43. removeEvent: function(type,callback){
  44. var self = this;
  45. if(self.element.removeEventListener) {
  46. self.element.removeEventListener(type,callback,false);
  47. }else if(self.element.detachEvent) {
  48. // 移除对应的自定义属性监听
  49. self.element.detachEvent('onpropertychange',self.element['callback' + callback]);
  50. // 删除储存在 DOM 上的自定义事件的回调
  51. self.element['callback' + callback] = null;
  52. }else {
  53. self.element.detachEvent('on' + type,callback);
  54. }
  55. return self;
  56. },
  57. /*
  58. * 触发事件
  59. * @param {String} type 触发事件的类型
  60. * @return {object} 返回的对象
  61. */
  62. triggerEvent: function(type){
  63. var self = this;
  64. if(self.element.dispatchEvent) { // 标准浏览器下
  65. // 创建事件
  66. var evt = document.createEvent('Event');
  67. // 定义事件的类型
  68. evt.initEvent(type,true,true);
  69. // 触发事件
  70. self.element.dispatchEvent(evt);
  71. }else if(self.element.fireEvent) { // IE
  72. self.element[type]++;
  73. }
  74. return self;
  75. }
  76. };

转载于:https://www.cnblogs.com/chenjinxinlove/p/8084747.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/849502
推荐阅读
相关标签
  

闽ICP备14008679号