让我们来探究JavaScript中的五种事件处理程序方式:
事件处理程序方式
在JavaScript中,有五种主要的事件处理程序方式:
- HTML事件处理程序
- DOM0级事件处理程序
- DOM2级事件处理程序
- DOM3级事件处理程序
- 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级事件处理程序是指通过addEventListener
或attachEvent
方法来为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
对象,需要通过call
和apply
方法来手动指定this
指向DOM节点。
DOM2级事件处理程序的优点是支持DOM节点的多个事件处理程序,不会覆盖已存在的事件处理程序;支持事件捕获和冒泡;可以通过removeEventListener
或detachEvent
来删除事件处理程序。缺点是在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技术站