探究JavaScript中的五种事件处理程序方式

让我们来探究JavaScript中的五种事件处理程序方式:

事件处理程序方式

在JavaScript中,有五种主要的事件处理程序方式:

  1. HTML事件处理程序
  2. DOM0级事件处理程序
  3. DOM2级事件处理程序
  4. DOM3级事件处理程序
  5. EventUtil事件处理程序

下面我们将会详细讲解这五种事件处理程序方式的用法和区别。

1. HTML事件处理程序

HTML事件处理程序是指直接在HTML标签中通过指定事件属性来处理事件的方式。例如:

<button onclick="alert('clicked')">Click me</button>

这里,我们在<button>标签中指定了onclick属性,当用户点击该按钮时,alert('clicked')函数会被执行。

HTML事件处理程序的优点是简单直接,可以快速完成功能的实现。但它也存在以下缺点:

  • HTML和JavaScript代码紧密耦合,不易于维护和重用;
  • 如果存在大量的HTML事件处理程序,会导致HTML代码臃肿不易读;
  • HTML事件处理程序只能绑定一个函数,如果需要绑定多个函数,就需要在HTML代码中书写多个事件属性,不利于代码的整洁和可读性。

2. DOM0级事件处理程序

DOM0级事件处理程序是指直接将事件处理程序赋值给DOM节点属性的方式。例如:

var button = document.querySelector('button');
button.onclick = function() {
  alert('clicked');
};

这里,我们选择了一个<button>元素,然后将onclick属性赋值为一个匿名函数,当用户点击该按钮时,alert('clicked')函数会被执行。

DOM0级事件处理程序的优点是简单易懂、兼容性好,可以用来处理简单的事件。但它也存在以下缺点:

  • DOM节点只能绑定一个事件处理程序,如果需要绑定多个处理程序,就会相互覆盖;
  • 当要删除某个事件处理程序时,必须将该处理程序设置为null,否则无法删除。

3. DOM2级事件处理程序

DOM2级事件处理程序是指通过addEventListenerattachEvent方法来为DOM节点添加事件处理程序的方式。例如:

var button = document.querySelector('button');
button.addEventListener('click', function() {
  alert('clicked');
}, false);

这里,我们选择了一个<button>元素,然后通过addEventListener方法,向它添加了一个事件监听器,当用户点击该按钮时,alert('clicked')函数会被执行。第三个参数false表示在事件捕获阶段处理事件。

attachEvent方法是addEventListener方法在IE中的替代品,用法类似。但需要注意的是,IE浏览器中使用attachEvent时,事件处理程序中的this指向的是window对象,需要通过callapply方法来手动指定this指向DOM节点。

DOM2级事件处理程序的优点是支持DOM节点的多个事件处理程序,不会覆盖已存在的事件处理程序;支持事件捕获和冒泡;可以通过removeEventListenerdetachEvent来删除事件处理程序。缺点是在IE浏览器中需要使用attachEvent方法。

4. DOM3级事件处理程序

DOM3级事件处理程序是指通过addEventListener方法的第三个参数来指定事件的处理方式的方式。例如:

var button = document.querySelector('button');
button.addEventListener('click', function() {
  alert('clicked');
}, {
  capture: false,
  once: false,
  passive: false,
});

这里,我们选择了一个<button>元素,然后通过addEventListener方法,向它添加了一个多属性事件监听器,当用户点击该按钮时,alert('clicked')函数会被执行。第三个参数包含三个属性:capture表示是否在事件捕获阶段处理事件;once表示是否仅处理一次事件,处理后自动删除事件处理程序;passive表示是否允许在该事件处理程序中调用preventDefault方法。

DOM3级事件处理程序在DOM2级事件处理程序的基础上增加了多种事件处理方式,适应了更多的开发需求。

5. EventUtil事件处理程序

EventUtil事件处理程序是指使用一个独立的事件处理程序库来封装DOM事件处理程序的方式。例如:

var button = document.querySelector('button');
EventUtil.addHandler(button, 'click', function() {
  alert('clicked');
});

这里,我们通过EventUtil.addHandler方法来添加事件处理程序,当用户点击该按钮时,alert('clicked')函数会被执行。

EventUtil事件处理程序的优点是封装了DOM事件处理程序的各种陷阱和不兼容问题,使得事件处理程序的编写更加简单方便。缺点是需要引入第三方库,增加了代码的依赖性。

示例说明

下面我们来使用两个示例来说明这五种事件处理程序方式的区别:

示例1:点击按钮修改其文本

首先,我们创建一个按钮,并为其添加一个事件处理程序。当用户点击该按钮时,按钮的文本就会被修改为"Clicked!"。

HTML事件处理程序

<button onclick="this.innerText='Clicked!'">Click me</button>

DOM0级事件处理程序

var button = document.querySelector('button');
button.onclick = function() {
  this.innerText = 'Clicked!';
};

DOM2级事件处理程序

var button = document.querySelector('button');
button.addEventListener('click', function() {
  this.innerText = 'Clicked!';
}, false);

DOM3级事件处理程序

var button = document.querySelector('button');
button.addEventListener('click', function() {
  this.innerText = 'Clicked!';
}, {
  capture: false,
  once: false,
  passive: false,
});

EventUtil事件处理程序

var button = document.querySelector('button');
EventUtil.addHandler(button, 'click', function() {
  button.innerText = 'Clicked!';
});

示例2:为多个按钮添加点击事件

我们现在创建了三个按钮,并为它们添加了一个点击事件处理程序。当用户点击按钮时,会在控制台中输出按钮的文本。

HTML事件处理程序

<button onclick="console.log(this.innerText)">Button1</button>
<button onclick="console.log(this.innerText)">Button2</button>
<button onclick="console.log(this.innerText)">Button3</button>

DOM0级事件处理程序

var buttons = document.querySelectorAll('button');
for (var i = 0; i < buttons.length; i++) {
  buttons[i].onclick = function() {
    console.log(this.innerText);
  };
}

DOM2级事件处理程序

var buttons = document.querySelectorAll('button');
for (var i = 0; i < buttons.length; i++) {
  buttons[i].addEventListener('click', function() {
    console.log(this.innerText);
  }, false);
}

DOM3级事件处理程序

var buttons = document.querySelectorAll('button');
for (var i = 0; i < buttons.length; i++) {
  buttons[i].addEventListener('click', function() {
    console.log(this.innerText);
  }, {
    capture: false,
    once: false,
    passive: false,
  });
}

EventUtil事件处理程序

var buttons = document.querySelectorAll('button');
for (var i = 0; i < buttons.length; i++) {
  EventUtil.addHandler(buttons[i], 'click', function() {
    console.log(this.innerText);
  });
}

从上面两个示例中可以看出,五种事件处理程序方式具有各自的特点和适用场景,我们需要根据实际需求进行选择。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:探究JavaScript中的五种事件处理程序方式 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • JS检测浏览器开发者工具是否打开的方法详解

    下面我将详细讲解JS检测浏览器开发者工具是否打开的方法。 一、检测方法 1. 监听 console 字符串输出 开发者工具在控制台中输出字符串时,会触发 console 对象的一些方法,如 console.log()、console.warn()、console.error() 等。我们可以通过监听这些方法的调用来判断开发者工具是否打开: var open …

    JavaScript 2023年6月11日
    00
  • 13个JavaScript 一行程序,让你看起来就是个专家

    下面我将详细讲解“13个JavaScript 一行程序,让你看起来就是个专家”的完整攻略。 首先,这篇文章介绍了13个能让你看起来很专业的 JavaScript 一行程序。这些程序都非常短小精悍,并且可以快速解决一些常见的编程问题。下面我们逐一介绍一下这些程序。 1. 取两个数中的最小值 const min = (a, b) => a < b ?…

    JavaScript 2023年5月18日
    00
  • JS实现键值对遍历json数组功能示例

    下面我将为您详细讲解“JS实现键值对遍历json数组功能示例”的完整攻略。 一、前置知识 在进行键值对遍历json数组的操作前,需要您先了解以下基础知识: JSON数组:JSON是一种轻量级的数据交换格式,通常使用JSON格式来传输数据,JSON数组即是由多个JSON对象组成的数组。 for…in循环:用于遍历一个对象的所有可枚举属性,循环中可以获取到枚…

    JavaScript 2023年5月27日
    00
  • Cookies 和 Session的详解及区别

    我来详细讲解一下“Cookies 和 Session的详解及区别”。 Cookies 和 Session的概述 Cookies:保存在客户端,并且数据较为小巧,可以通过浏览器修改; Session:保存在服务端,因此不太容易被攻击,并且能够存储较为敏感的用户信息。 Cookies和Session的使用 Cookies的使用 Cookies的使用主要有以下几个…

    JavaScript 2023年6月11日
    00
  • javascript中的几个运算符

    下面是Javascript中的几个运算符的详细讲解。 算术运算符 算术运算符是用来执行数学运算的运算符。Javascript中包含了基础的加、减、乘、除、求余运算符。 var x = 10; var y = 3; console.log(x + y); // 13 console.log(x – y); // 7 console.log(x * y); //…

    JavaScript 2023年5月18日
    00
  • JavaScript常用标签和方法总结

    针对这个话题,我准备了以下完整攻略。 JavaScript常用标签和方法总结 标签 在JavaScript中,我们通常使用以下标签: \<script> – 嵌入JavaScript代码的标签,可以放在HTML的\<head>或\<body>中。 \<button> – 创建一个按钮元素,可以用JavaScri…

    JavaScript 2023年5月18日
    00
  • 解析JavaScript数组方法reduce

    解析JavaScript数组方法reduce reduce()是JavaScript数组对象自带的方法之一,可以对数组中的所有元素依次执行一个指定的回调函数,返回一个累加的结果。它的语法如下: arr.reduce(callback[, initialValue]) 其中,callback是一个函数,它可以接受四个参数: accumulator:累加器的值(…

    JavaScript 2023年5月27日
    00
  • vue+element实现动态加载表单

    当使用Vue.js和Element UI开发前端表单界面时,如果表单非常复杂,且需要动态生成,Vue.js + Element UI提供了两个有效的方法:使用v-for和createElement API。下面我来基于这两个方法介绍vue+element实现动态加载表单的完整攻略。 方法一:使用v-for 使用v-for方法,我们可以基于数据生成表单元素。 …

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部