当前位置:首页 > JavaScript

js实现event函数

2026-03-16 08:19:17JavaScript

实现自定义事件函数

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

使用EventTarget原生API

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

// 创建事件目标对象
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');

使用观察者模式实现

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

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元素也支持自定义事件派发:

js实现event函数

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实现轮播

实现基础轮播效果 使用HTML结构创建轮播容器和图片元素: <div class="carousel"> <div class="carousel-inner">…

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Par…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js实现目录

js实现目录

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

react如何使用函数

react如何使用函数

使用函数组件的基本语法 在React中,函数组件是通过JavaScript函数定义的组件。函数接收props作为参数,并返回React元素。 function Welcome(props) {…