当前位置:首页 > JavaScript

js简单实现订阅事件

2026-01-31 04:03:51JavaScript

实现订阅事件的基本模式

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

js简单实现订阅事件

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方法:

js简单实现订阅事件

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:

const target = new EventTarget();

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

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

注意事项

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

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

相关文章

vue 实现拖拽事件

vue 实现拖拽事件

实现拖拽事件的基本步骤 在Vue中实现拖拽功能可以通过HTML5的Drag and Drop API或第三方库如vuedraggable来完成。以下是两种方法的详细说明。 使用HTML5 Drag…

vue实现简单分页

vue实现简单分页

实现基础分页功能 在Vue中实现简单分页需要几个核心步骤:数据分片、页码计算、翻页逻辑。以下是一个基于Vue 3的示例实现方案: <template> <div>…

vue实现事件委托

vue实现事件委托

事件委托的概念 事件委托是一种利用事件冒泡机制的技术,将子元素的事件监听绑定到父元素上,通过事件目标(event.target)判断实际触发事件的子元素,从而减少事件监听器的数量,提升性能。 Vue…

vue如何实现事件处理

vue如何实现事件处理

Vue 事件处理基础 Vue 通过 v-on 指令(简写为 @)实现事件绑定。语法格式为 @事件名="处理函数",处理函数需在 Vue 实例的 methods 中定义。 <template…

vue中实现点击事件

vue中实现点击事件

在 Vue 中实现点击事件的方法 使用 v-on 指令绑定点击事件 Vue 提供了 v-on 指令用于监听 DOM 事件。可以通过 v-on:click 或简写为 @click 来绑定点击事件。 &…

vue怎么实现事件嵌套

vue怎么实现事件嵌套

事件嵌套的实现方法 在Vue中实现事件嵌套通常涉及在父组件中监听子组件的事件,或在同一组件内处理多个事件的联动。以下是几种常见场景的解决方案: 父子组件间事件嵌套 父组件通过v-on监听子组件触发的…