JavaScript中自定义事件处理的不同方式之间有什么区别?

JavaScript中自定义事件处理的不同方式之间有什么区别?,javascript,javascript-events,Javascript,Javascript Events,我看到了以下关于JavaScript中自定义事件处理的帖子。从这些文章中,有两种(至少)处理/触发自定义事件的方法: 使用DOM方法(createEvent、dispatchEvent) 自定义代码 但是,处理(触发和订阅)自定义事件的推荐方法是什么 [编辑]此问题的上下文不使用任何库,如jQuery、YUI等,。。。但只是简单的JavaScript [Edit 2]似乎存在细微的差异,至少在错误处理方面是如此。 Dean Edwards()建议采用前一种方式处理定制事件。我们

我看到了以下关于JavaScript中自定义事件处理的帖子。从这些文章中,有两种(至少)处理/触发自定义事件的方法:

  • 使用DOM方法(createEvent、dispatchEvent)


  • 自定义代码
  • 但是,处理(触发和订阅)自定义事件的推荐方法是什么

    [编辑]此问题的上下文不使用任何库,如jQuery、YUI等,。。。但只是简单的JavaScript

    [Edit 2]似乎存在细微的差异,至少在错误处理方面是如此。
    Dean Edwards()建议采用前一种方式处理定制事件。我们能说这是一种区别吗?

    你所描述的是两者之间的区别

    • 一个自定义的基于事件的消息传递系统
    • 手动触发DOM事件
    前者是使用事件进行消息传递的一种方法。例如,创建一个

    后者只是一种手动使用浏览器内置DOM事件系统的方法。这基本上是使用本机存在于(有能力/现代)浏览器中的

    所以问题很简单,你想做什么?激发DOM事件还是使用事件进行消息传递

    DOM似乎有巨大的开销。这样做是因为它支持事件传播和冒泡。之所以如此,是因为它支持将事件绑定到DomeElement

    如果您不需要DOM3事件的任何功能,请使用所选的发布/订阅库

    [编辑2]

    这都是关于错误处理的,如何处理错误取决于你自己。如果您知道事件发射器是同步的,那么这就是预期的行为。您可以自己处理错误,也可以使用
    setTimeout
    使其异步


    请注意,如果将其设置为异步,则会“丢失”事件处理程序在发出/触发/分派调用返回后完成其逻辑的保证。这需要完全不同的高级设计,然后假设事件发射器是同步的这不是一个轻率的选择

    每个选择都有优点和缺点。使用适合你的东西

    使用DOM方法最明显的“缺点”是,它们与基于浏览器的部署相关联,即使DOM没有真正意义(例如,消息传递与DOM对象无关),它们也会涉及DOM,而标准样式的实现可以用于任何环境,而不仅仅是web浏览器,以及任何你喜欢的通用对象


    做自己的实现最明显的“弊病”是你做了自己的观察者实现,而不是重用环境中已经存在的东西(测试、调试、优化等)。

    许多库已经提供了处理事件的方法,我建议只使用现有库。如果使用DOM,则假定浏览器提供必要的支持,而如果使用自定义机制,则可能会牺牲自定义实现的速度。如果依赖现有库,库可以选择适当的折衷方案


    例如,Closure提供的接口与DOM机制的接口相似,但不依赖于浏览器为其提供本机支持。

    您是否使用任何框架?JQuery和YUI都内置了事件处理。我在我的项目中使用了JQuery和YUI,并且我已经多次使用它们。但是我想知道不使用任何库的自定义事件处理。谢谢。他可能真的想手动触发DOM事件,而不是使用内置DOM事件作为自定义发布/订阅系统。@T.J.Crowder谢谢你的回答。但是,当谈到由不同元素同时触发/订阅的数百个事件(如果有的话)时,您知道性能差异吗?@Raynos否,我想触发一个自定义事件,比如发送消息时的“msgsent”。Thanks@mrCoder:对不起,我不知道。我可以推测,但通常当人们猜测JavaScript在特定场景中的性能时,最终会看起来像个白痴。:-)在一个实现上快的是在另一个实现上慢的;由于过去使用其他语言的经验而看似合理的东西却被证明不合理地应用于这种语言,等等。很少有语句“不要过早优化”比JavaScript更适用于JavaScript,尤其是浏览器上的JavaScript。Best,@T.J.Crowder您应该知道DOM3事件有很多神奇的内置功能(绑定到元素、传播、冒泡),因此总是比只传递消息的轻量级自定义实现慢。我想使用自定义事件发布/订阅机制,就像每次单击“发送”按钮并将消息发送到服务器时一样,我希望发布“msgsent”事件,然后将调用绑定到该自定义事件的侦听器。这有助于维护事件创建代码和顺序执行代码(侦听器代码)之间的松散耦合。Thanks@mrCoderDOM的开销似乎相当大。使用自定义库,我推荐EventEmitter,因为它在node.jsah中使用,感谢基准Raynos。我想我应该使用ay酒吧/小图书馆。与EventEmitter相比,您知道其他库吗?还有关于迪安·爱德华兹建议的任何猜测(我编辑了我的问题,加入了他的博客帖子链接)?@mrCoder,这是具体实现的。问题在于您希望事件按顺序同步触发(即阻塞),还是按顺序异步触发,或者不按顺序异步触发。这是一个完全不同的讨论。使事件发射器异步有一些副作用。是的,正如我提到的,我很早就知道jQuery和YUI之类的库。但我只是想知道