当前位置:首页 > JavaScript

js实现event函数

2026-03-16 08:19:17JavaScript

实现自定义事件函数

在JavaScript中实现自定义事件函数可以通过多种方式完成,包括使用原生Event API、自定义事件类或观察者模式。以下是几种常见实现方法:

使用EventTarget原生API

现代浏览器支持内置的EventTarget接口,可直接用于事件监听和派发:

js实现event函数

// 创建事件目标对象
const eventTarget = new EventTarget();

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

// 派发自定义事件
const event = new CustomEvent('customEvent', {
  detail: { message: 'Hello World' }
});
eventTarget.dispatchEvent(event);

实现简单的事件总线

创建一个事件总线类管理多个事件监听器:

class EventBus {
  constructor() {
    this.listeners = {};
  }

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

  off(event, callback) {
    if (!this.listeners[event]) return;
    this.listeners[event] = this.listeners[event].filter(
      listener => listener !== callback
    );
  }

  emit(event, ...args) {
    if (!this.listeners[event]) return;
    this.listeners[event].forEach(callback => {
      callback(...args);
    });
  }
}

// 使用示例
const bus = new EventBus();
bus.on('log', message => console.log(message));
bus.emit('log', 'Event triggered');

使用观察者模式实现

观察者模式提供更灵活的事件管理方式:

js实现event函数

class Observable {
  constructor() {
    this.observers = [];
  }

  subscribe(fn) {
    this.observers.push(fn);
  }

  unsubscribe(fn) {
    this.observers = this.observers.filter(subscriber => subscriber !== fn);
  }

  notify(data) {
    this.observers.forEach(observer => observer(data));
  }
}

// 使用示例
const observable = new Observable();
const logger = data => console.log('Received:', data);
observable.subscribe(logger);
observable.notify({ value: 42 });

支持一次性事件监听

扩展事件总线支持一次性事件监听:

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

  on(event, listener) {
    (this.events[event] || (this.events[event] = [])).push(listener);
  }

  once(event, listener) {
    const onceWrapper = (...args) => {
      listener(...args);
      this.off(event, onceWrapper);
    };
    this.on(event, onceWrapper);
  }

  off(event, listener) {
    if (!this.events[event]) return;
    this.events[event] = this.events[event].filter(l => l !== listener);
  }

  emit(event, ...args) {
    (this.events[event] || []).forEach(listener => listener(...args));
  }
}

在DOM元素上使用自定义事件

DOM元素也支持自定义事件派发:

const element = document.getElementById('myElement');

element.addEventListener('build', (e) => {
  console.log(e.detail.time);
});

const event = new CustomEvent('build', {
  detail: { time: Date.now() }
});

element.dispatchEvent(event);

以上实现方式可根据具体需求选择,原生EventTarget适合简单场景,自定义事件类提供更多控制,观察者模式适合复杂事件系统。

标签: 函数js
分享给朋友:

相关文章

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:…

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…