Javascript 为什么有些事件处理程序是由dispatchEvent触发的,而另一些则不是?

Javascript 为什么有些事件处理程序是由dispatchEvent触发的,而另一些则不是?,javascript,events,browser,dom-events,Javascript,Events,Browser,Dom Events,基于事件的JS有两个基本API:事件侦听器和事件处理程序。 事件侦听器已注册到addEventListener, 事件处理程序使用API注册,如target.onfoobar=(ev)=>{…}。 然后可以使用dispatchEvent发送事件。 但我不清楚dispatchEvent如何/何时/是否调用事件处理程序 我最初的思维模式是在dispatchEvent的末尾调用事件处理程序。 也就是说,dispatchEvent看起来像这样: EventTarget.prototype.dispatc

基于事件的JS有两个基本API:事件侦听器和事件处理程序。 事件侦听器已注册到
addEventListener
, 事件处理程序使用API注册,如
target.onfoobar=(ev)=>{…}
。 然后可以使用
dispatchEvent
发送事件。 但我不清楚
dispatchEvent
如何/何时/是否调用事件处理程序

我最初的思维模式是在
dispatchEvent
的末尾调用事件处理程序。 也就是说,
dispatchEvent
看起来像这样:

EventTarget.prototype.dispatchEvent=函数(事件){
//首先发送到this.listeners,然后:
const handler=this['on'+event.type];
if(处理程序)处理程序(事件);
};
有时,
dispatchEvent
会调用事件处理程序:

window.onclick=()=>console.log(“这叫做!!”);
窗口。dispatchEvent(新事件(“单击”);
但在其他情况下,
dispatchEvent
不调用事件处理程序:

window.onxyz=()=>console.log(“这不是调用!!”);
dispatchEvent(新事件(“xyz”));
我不知道如何解释这种差异。 这两种情况有什么区别? 是否
click
是一种“标准”事件类型, 但是xyz不是吗? 如果是,什么构成“标准”事件类型,
dispatchEvent
如何知道两者之间的区别呢?

这是因为
onclick
是的一部分(通过它的include of,它反过来指的是),而
onxyz
不是
onxyz
只是您自己的expando属性,据浏览器所知,它与事件没有任何连接

支持自定义事件,它们只是没有自己的特殊属性,因此您必须使用适当的事件注册方法(
addEventListener
在现代系统中,
attachEvent
在Internet Explorer的过时版本中):

window.addEventListener(“xyz”,()=>console.log(“这叫做!!”);

dispatchEvent(新事件(“xyz”))onclick
在某些方面是一个已定义的方法,比如HTML元素<代码>onxyz只是一个属性名称-即,您的“心智模式”有缺陷。。。无论如何如果你说
onclick=fna
那么
onclick=fnb
。。。只有
fnb
被调用。。。那么
addEventListener
如何适合您的模型?因为您可以拥有任意数量的
eventListener
s!