当前位置:首页 > JavaScript

js简单实现订阅事件

2026-01-31 04:03:51JavaScript

实现订阅事件的基本模式

订阅事件通常基于观察者模式(Observer Pattern)实现,允许对象订阅特定事件并在事件触发时接收通知。

class EventEmitter {
  constructor() {
    this.events = {};
  }

  on(eventName, callback) {
    if (!this.events[eventName]) {
      this.events[eventName] = [];
    }
    this.events[eventName].push(callback);
  }

  emit(eventName, ...args) {
    const callbacks = this.events[eventName];
    if (callbacks) {
      callbacks.forEach(callback => callback(...args));
    }
  }

  off(eventName, callback) {
    const callbacks = this.events[eventName];
    if (callbacks) {
      this.events[eventName] = callbacks.filter(cb => cb !== callback);
    }
  }
}

使用示例

const emitter = new EventEmitter();

// 订阅事件
const handleMessage = (msg) => console.log(`Received: ${msg}`);
emitter.on('message', handleMessage);

// 触发事件
emitter.emit('message', 'Hello World'); // 输出: Received: Hello World

// 取消订阅
emitter.off('message', handleMessage);

支持一次性订阅

扩展EventEmitter以支持once方法:

class EventEmitter {
  // ...原有代码...

  once(eventName, callback) {
    const wrapper = (...args) => {
      callback(...args);
      this.off(eventName, wrapper);
    };
    this.on(eventName, wrapper);
  }
}

// 使用示例
emitter.once('temp', (data) => console.log('One-time:', data));
emitter.emit('temp', 'Data1'); // 输出: One-time: Data1
emitter.emit('temp', 'Data2'); // 无输出

浏览器环境中的实现

在浏览器中可以直接使用DOM的EventTarget API:

js简单实现订阅事件

const target = new EventTarget();

// 添加事件监听
target.addEventListener('customEvent', (e) => {
  console.log(e.detail);
});

// 触发事件
target.dispatchEvent(
  new CustomEvent('customEvent', { detail: 'Browser Event' })
);

注意事项

  • 内存管理:确保在不再需要时取消订阅,避免内存泄漏
  • 错误处理:建议在回调函数中添加try-catch块
  • 性能考虑:对于高频事件,可能需要考虑节流或防抖处理

标签: 事件简单
分享给朋友:

相关文章

vue简单实现picker效果

vue简单实现picker效果

Vue 实现 Picker 效果 在 Vue 中实现 Picker 效果可以通过自定义组件或使用第三方库完成。以下是两种常见方法: 自定义滚动选择器 使用原生滚动行为实现 Picker 效果,适用于…

vue实现人工点击事件

vue实现人工点击事件

Vue 中实现人工点击事件的方法 在 Vue 中可以通过多种方式触发点击事件,以下是几种常见的实现方法: 使用 v-on 或 @ 指令绑定原生事件 通过模板语法直接绑定原生 click 事件: &…

vue轮播图简单实现

vue轮播图简单实现

使用 Vue 实现轮播图 以下是一个基于 Vue 3 的简单轮播图实现方法,无需依赖第三方库。 基础结构 在 Vue 单文件组件中,通过 v-for 渲染图片列表,并用 CSS 控制切换效果。 &…

简单的vue实现原理

简单的vue实现原理

Vue 的实现原理 Vue 的核心实现原理主要包括响应式系统、虚拟 DOM 和模板编译。以下是这些核心概念的简要说明: 响应式系统 Vue 通过 Object.defineProperty(Vue…

vue如何实现事件委托

vue如何实现事件委托

Vue 中实现事件委托的方法 事件委托是一种利用事件冒泡机制将子元素的事件处理委托给父元素的优化技术。Vue 中可以通过以下几种方式实现: 使用 v-on 和事件修饰符 通过 v-on 指令…

vue实现关闭页面事件

vue实现关闭页面事件

Vue 实现页面关闭事件 在 Vue 中监听页面关闭事件,可以通过 beforeunload 或 unload 事件实现。以下是几种常见方法: 方法一:使用 window.addEventListe…