当前位置:首页 > 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方法:

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块
  • 性能考虑:对于高频事件,可能需要考虑节流或防抖处理

js简单实现订阅事件

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

相关文章

vue实现全屏事件

vue实现全屏事件

Vue 实现全屏事件的方法 在 Vue 中实现全屏功能可以通过浏览器提供的 Fullscreen API 来实现。以下是几种常见的实现方式: 使用原生 Fullscreen API 通过调用 El…

vue实现简单搜索

vue实现简单搜索

Vue 实现简单搜索功能 数据绑定与输入框 在 Vue 中实现搜索功能,通常使用 v-model 绑定输入框的值到数据属性。创建一个输入框用于用户输入搜索关键词: <template>…

vue实现事件代理

vue实现事件代理

事件代理的概念 事件代理(Event Delegation)是一种利用事件冒泡机制,将子元素的事件委托给父元素统一处理的技术。在Vue中,可以通过v-on指令或$on方法实现事件代理,减少事件监听器的…

vue实现事件捕获

vue实现事件捕获

Vue 中实现事件捕获的方法 在 Vue 中,默认情况下事件是通过冒泡机制传递的。如果需要实现事件捕获,可以通过以下方式: 使用 .capture 修饰符 Vue 提供了 .capture 事件修饰…

vue实现简单登录

vue实现简单登录

使用 Vue 实现简单登录功能 创建 Vue 项目 确保已安装 Vue CLI,通过以下命令创建新项目: vue create vue-login-demo 选择默认配置或手动配置(如 Babel…

vue实现activeX事件

vue实现activeX事件

在 Vue 中实现 ActiveX 事件 在 Vue 项目中集成 ActiveX 控件并监听其事件,可以通过以下步骤完成。ActiveX 控件通常用于嵌入浏览器中的特定功能(如旧版 IE 支持的插件)…