处理程序和监听器是同一个东西 - 只是用于处理事件的函数的同义词。 "Handler" 可能是更被接受的术语,对我来说在语义上肯定更正确。术语 "listener" 源自用于将事件添加到元素的代码:
element.addEventListener('click', function() { /* do stuff here*/ }, false);
然而,您可以非常挑剔地将这两个术语分开解释。 如果您有兴趣,"handler" 可以是处理添加 "listener" 时将要处理事件的函数的术语,因此一个可以拥有多个利用单个 "handler" 的 "listeners"。请考虑:
// handler is synonymous with function
function someFunction(e) {
if (typeof e == 'undefined')
alert('called as a function');
else
alert('called as a handler');
}
// use someFunction as a handler for a
// click event on element1 -- add a "listener"
element.addEventListener('click', someFunction, false);
// use an anonymous function as a handler for a
// click event on element1 -- add another "listener"
element.addEventListener('click', function () { alert('anonymoose'); }, false);
// use someFunction as a handler for a
// click event on element2 -- add a "listener"
element2.addEventListener('click', someFunction, false);
// call someFunction right now
someFunction();
所以在上面的代码中,我有两个“处理程序”(someFunction 和一个匿名函数)和三个“监听器”。
再次强调,这只是语义问题 - 在实际应用中,“监听器”和“处理程序”这两个术语通常可以互换使用。如果需要区分,那么一个监听器是订阅事件的操作,会触发对一个处理程序(即一个函数)的调用。
如清泥般清晰明了,是吗?
这没有区别;只是对同一个事物使用不同的术语。
为了实现事件处理,与DOM元素相关联的函数有不同的方法,这就是全部。差异在标准还不稳定时出现(或者因为实现者有点难以理解),但最终机制本质上是相同的。
如果您对要使用的事件处理程序注册方式感到困惑,可以:
这个网站(有趣的是其中一个评论循环引用了这里),它与在这里回答“它们是相同的”的人不同,其中粘贴了一个答案:
一个区别是,如果您为同一个按钮单击添加两个事件处理程序,则第二个事件处理程序将覆盖第一个,并且仅触发该事件。例如:
document.querySelector('.btn').onclick = function() {
console.log('Hello ');
};
document.querySelector('.btn').onclick = function() {
console.log('World!');
};
// This logs "World!" out to the console.
但如果你使用addEventListener,那么这两个触发器都将运行。
document.querySelector('.btn').addEventListener('click', function() {
console.log('Hello ');
});
document.querySelector('.btn').addEventListener('click', function() {
console.log('World!');
});
// This logs "Hello" and "World!" out to the console.
它们都用于在事件发生时关联一个函数。如果使用事件监听器,您可以在指定的事件中侦听多次(重复),例如,在独立的事件监听器中侦听两个单独的“click”事件,但是当使用处理程序时,这是不可能的,因为处理程序是您dom对象的属性,如果在同一事件处理程序中多次分配一个函数,例如,当将tow处理程序设置为onClick事件的a元素时,最后一个事件处理程序分配会起作用。
myElement= document.querySelector('#btn');
myElement.onClick = function(){
alert('first event handler');
}
myElement.onClick = function(){
alert('second event handler');
}
// result : occur last handler >> alert('second event handler');
but if using the event listeners you can listen to how many times listen to the same
event.
myElement.addEventListener('click',()=>{
alert('first listener')
})
myElement.addEventListener('click',()=>{
alert('second listener')
})
/* result : occur both listeners - alert('firstlistener') >> and next >> alert('second
listener'); */
没有太大的区别。我们可以说它们几乎是相同的东西,除了三个微小的不同之处:
有关更多信息,请参见
https://javascript.info/introduction-browser-events#object-handlers-handleevent