JavaScript自定义事件

javascript,自定义,事件 · 浏览次数 : 8

小编点评

**1. 引言** 在Web中,事件通常是指某个动作的完成,比如,鼠标点击、鼠标移动、键盘按下等事件监听,通常是指监听某个动作,动作完成后触发相应的变化,如,鼠标点击按钮后弹出确认框通过事件监听,当某个事件完成或者状态改变时,可以触发监听者的更新或预设行为。 **2. 内置事件在Web中** 事件的主体(即,可以触发与监听事件的对象)通常是DOM对象,如,Button、Div等。 **3. 自定义事件** 如果DOM对象没有内置了主动触发的方法,可以使用下面这种方式: * 设置事件的`on`属性,并使用`addEventListener`方法添加事件监听器。 * 使用`dispatchEvent`方法触发事件。 **4. DOM对象事件** DOM对象支持以下事件: * `click`:当鼠标点击元素时触发。 * `load`:当元素被加载时触发。 * `dataLoaded`:当数据加载完成后触发。 **5. CustomEvent** CustomEvent是一种自定义事件,它是一个对象事件,可以自定义事件名称和事件类型。可以使用`dispatchEvent`方法触发CustomEvent,并注册事件监听器以处理事件。 **6. 示例** 以下是一个使用DOM对象监听`dataLoaded`事件的示例: ```javascript const container = document.getElementById('containter'); container.addEventListener('dataLoaded', (e) => { console.log(e.detail); container.innerHTML = `<h1>${e.detail.name}</h1><p>${e.detail.age}</p>`; }); function doSomething() { // ... } ``` **7. 参考资料** * [1] 事件参考 | MDN (mozilla.org) * [2] CustomEvent - Web API 接口参考 | MDN (mozilla.org) * [3] EventTarget - Web API 接口参考 | MDN (mozilla.org)

正文

1. 引言

在Web中,事件,通常是指某个动作的完成,比如,鼠标点击、鼠标移动、键盘按下等

事件监听,通常是指监听某个动作,动作完成后触发相应的变化,如,鼠标点击按钮后弹出确认框

通过事件监听,当某个事件完成或者状态改变时,可以触发监听者的更新或预设行为,比如,点击按钮弹出确认框、窗口大小改变时网页内容也改变大小等

在软件工程中,这种设计模式叫观察者模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新

2. 内置事件

在Web中,事件的主体(即,可以触发与监听事件的对象)通常是DOM对象,如,Button、Div等

2.1 事件监听

事件监听是主要的应用场景

HTML和JS已经内置了大部分会出现的事件,经典的事件如点击事件,通常Button可以这样监听:

<body>
  <button>按钮</button>
  <script>
    var btn = document.querySelector('button');
      
    btn.onclick = function() {
      console.log('click');
    }
  </script>
</body>

即设置on+<event name>属性的方式,设置对事件的监听

现在通常使用下面的方式实现监听:

<body>
  <button>按钮</button>
  <script>
    var btn = document.querySelector('button');

    btn.addEventListener('click', function() {
      console.log('click');
    });
    
  </script>
</body>

浏览器中实现的详细的事件,可以从MDN中查询:Event - Web API 接口参考 | MDN (mozilla.org)

2.2 事件触发

通常事件触发是行为触发的,比如,鼠标去点击按钮触发

有时需要通过代码去主动触发,如何实现代码主动触发事件呢

经典的事件,通常DOM对象内置了主动触发的方法,如点击事件:

<body>
  <button>按钮</button>
  <script>
    var btn = document.querySelector('button');

    btn.addEventListener('click', function() {
      console.log('click');
    });
      
    btn.click(); // 触发点击事件
    
  </script>
</body>

如果DOM对象没有内置了主动触发的方法,可以使用下面这种方式:

<body>
  <button>按钮</button>
  <script>
    var btn = document.querySelector('button');

    btn.addEventListener('click', function() {
      console.log('click');
    });

    btn.dispatchEvent(new Event('click')); // 触发click事件
    
  </script>
</body>

3. 自定义事件

3.1 DOM对象

上述事件是浏览器内置所支持的,加入浏览器没有支持或者想自定义事件呢,比如,想监听数据加载,加载完成后对应的DOM元素刷新

这时可以设置一个名为dataLoaded的自定义事件(Custom Event),将DOM元素设置为监听者,然后加载数据后触发事件:

<body>
  <div id="containter"></div>
  <script>
    const container = document.getElementById('containter');

    container.addEventListener('dataLoaded', (e) => {
      console.log(e.detail);
      container.innerHTML = `<h1>${e.detail.name}</h1><p>${e.detail.age}</p>`
    })

    function load() {
      // 模拟数据加载
      const data = {
        name: 'John',
        age: 20
      }
      const event = new CustomEvent('dataLoaded', {
        detail: data
      })
      container.dispatchEvent(event); // 触发dataLoaded事件
    }

    load();
  </script>
</body>

CustomEvent的详细介绍可以参考:CustomEvent() - Web API 接口参考 | MDN (mozilla.org)

上述代码中,看上去这个事件机制用法是多余的,完全可以在加载数据后执行相应的更新函数即可,何必再套一层事件监听与事件触发呢

倒也不然,如下面这个例子,有三个文件,分别是index.htmlindex.jsrequest.js

index.html:

<body>
  <div id="containter"></div>
  <script>
    const container = document.getElementById('containter');

    container.addEventListener('dataLoaded', (e) => {
      console.log(e.detail);
      container.innerHTML = `<h1>${e.detail.name}</h1><p>${e.detail.age}</p>`
    })

  </script>
</body>

index.js:

const container = document.getElementById('containter');

container.addEventListener('dataLoaded', (e) => {
   doSomething()
})

function doSomething(){
    // ...
}

request.js:

function load() {
    // 模拟数据加载
    const data = {
        name: 'John',
        age: 20
    }
    const event = new CustomEvent('dataLoaded', {
        detail: data
    })
    container.dispatchEvent(event);
}

load();

上述示例中,在数据加载后,其余各处会执行相应的函数,代码组织也更为易懂

3.2 JS对象

上面所述的均为DOM对象,JS中的对象能否监听事件呢

答曰,可以,需要继承EventTarget

EventTarget详细的API介绍可以参考MDN:EventTarget - Web API 接口参考 | MDN (mozilla.org)

下面是一个示例代码,展示了如何编写一个类,继承自EventTarget,并实现事件监听功能:

class MyObject extends EventTarget {
  myMethod() {
    // 在方法内部触发事件
    this.dispatchEvent(new Event('myEvent'));
  }
}

// 实例化对象
const obj = new MyObject();

// 添加事件监听器
obj.addEventListener('myEvent', myEventHandler);

// 事件处理函数
function myEventHandler(event) {
  // 处理事件的逻辑
  console.log('Event triggered:', event);
}

// 调用方法,触发事件
obj.myMethod();

4 .参考资料

[1] 事件参考 | MDN (mozilla.org)

[2] CustomEvent - Web API 接口参考 | MDN (mozilla.org)

[3] EventTarget - Web API 接口参考 | MDN (mozilla.org)

与JavaScript自定义事件相似的内容:

JavaScript自定义事件

JavaScript事件和自定义事件

鸿蒙HarmonyOS实战-Web组件(前端函数和应用侧函数相互调用)

前言 前端函数和应用侧函数相互调用是指前端页面中的JavaScript函数和应用程序侧的函数之间进行相互调用。 在前端开发中,常常会使用JavaScript函数来处理用户的交互事件和操作。这些函数可以在前端页面中定义,例如通过事件监听器或者按钮点击事件来触发函数的执行。这些前端函数可以使用DOM

如何移除事件监听器

在运行时清理你的代码是构建高效、可预测的应用程序,没有商量余地的部分。在JavaScript中,实现这一目标的方法之一是很好地管理事件监听器,尤其是当不再需要时移除它们。 有好几种方法可以做到这件事情,每种都有自己的一套权衡方法,使其在某些情况下更合适。我们将介绍几种最常用的策略,以及当你试图决定哪

JavaScript自定义响应式对象

自定义一个响应式对象,分别是使用JavaScript的Object.defineProperty方法和Proxy对象来实现

JavaScript 中 toString 的奇妙使用

JavaScript 中的toString()方法,我们通常会一些其他类型的变量,转为字符串类型。但这里还有一些其他奇妙的用法。 不同的类型调用 toString() 会得到不同的结果。我们来一一分析下。 1. 函数类型 我们开发者自定义的函数,和 JavaScript 官方内置的函数,在调用 to

构建 JavaScript ChatGPT 插件

> 聊天插件系统是一种令人兴奋的新方式,可以扩展ChatGPT的功能,纳入您自己的业务数据,并为客户与您的业务互动增加另一个渠道。在这篇文章中,我将解释什么是聊天插件,它们能做什么,以及你如何用JavaScript建立你自己的聊天插件。 这篇文章(或OpenAI所称的"训练数据")提供了一个快速入门

ECMA标准ECMAScript(JavaScript的一个标准)和C#

2024 年 6 月 26 日,第 127 届 ECMA 大会正式批准了 ECMAScript 2024 语言规范,这意味着它现在正式成为最新 ECMAScript 标准。ECMAScript是ECMA标准中最著名的编程语言标准,它定义了JavaScript语言的核心特性。C#语言则是由ECMA国际

神奇的JavaScript弱等价类型转换

JavaScript语言特性 - 类型转换 JavaScript这门语言的类型系统从来没有它表面看起来的那样和善,虽然比起Java、C#等一众强类型语言,它的弱类型使用起来似乎是如此便利,但正因为它极高的自由度,所以才会衍生出令人摸不着头脑的荒诞行为。 举个例子,虽然我们都知道一个包含内容的字符串会

第119篇: JavaScript 类

好家伙,我们先来复习一下 关于Java,类的三大特征: 1、封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。 2、继承,继承性更符合认知规律,使程序更易于理解,同时节省不必要的重复代码。 3、多态,体现为覆盖和重载,Js没有重载,有

第一百一十八篇: JavaScript 原型链式继承

好家伙,好家伙,本篇为《JS高级程序设计》第八章“对象、类与面向对象编程”学习笔记 1.原型链 原型链是JS实现"继承"的方案之一 ECMA-262把原型链定义为ECMAScript的主要继承方式。其基本思想就是通过原型继承多个引用类型的属性和方法。 重温一下构造函数、原型和实例的关系:每个构造函数