JavaScript中的自定义事件与仅调用常规函数有何不同?

时间:2019-07-15 09:36:53

标签: javascript dom-events

例如,我已阅读David Walsh的这篇文章:

https://davidwalsh.name/customevent

// Trigger it!
myElement.dispatchEvent(myEvent);

正如作者在文章结尾所总结的:

  

使用自定义数据创建和触发自定义事件非常有用。您不仅可以为事件创建自己的命名约定,而且还可以沿途传递自定义数据!

我的理解方式:

不同于从程序外部触发事件,就像上面的示例似乎在滚动页面时一样,它是在程序中的某个特定位置手动调用函数。

我可以看到,这可能是组织程序,设计模式的一种方式,但是我在这里还缺少其他什么吗?

4 个答案:

答案 0 :(得分:4)

Javascript中的自定义事件是观察者模式的一种实现,其中,侦听器按事件名称分组。

引用Wikipedia

  

观察者设计模式可以解决什么问题?

     

观察者模式解决了以下问题:

     
      
  • 应该定义对象之间的一对多依赖关系,而不能使对象紧密耦合。
  •   
  • 应确保当一个对象更改状态时,将自动更新不限数量的相关对象。
  •   
  • 一个对象应该可以通知其他对象的不限数量。
  •   
     

通过定义一个直接更新依赖对象状态的对象(对象)来定义对象之间的一对多依赖是不灵活的,因为它将对象与特定的依赖对象耦合在一起。紧密耦合的对象很难实现,更改,测试和重用,因为它们引用并知道(如何更新)具有不同接口的许多不同对象。

     

观察者设计模式描述了什么解决方案?

     
      
  • 定义主题和观察者对象。
  •   
  • 以便当主题更改状态时,所有注册的观察者都将得到自动通知和更新。
  •   
     

主题的唯一责任是维护观察者列表,并通过调用其update()操作将状态更改通知他们。   观察者的责任是在一个主题上注册(或注销)自己(以通知状态更改),并在被通知时更新其状态(将其状态与主题的状态同步)。   这使得主题和观察者之间松散耦合。主体和观察者之间没有明确的知识。可以在运行时独立添加和删除观察者。   这种通知-注册交互也称为发布-订阅。

带有自定义事件的松散耦合代码非常灵活,但是如果以非结构化和过多的方式使用它们,流程很快就会变得不透明。

答案 1 :(得分:2)

来自MDN About custom events-它们主要用于创建综合事件

  

...此类事件通常称为综合事件,而不是   浏览器本身触发的事件。

综合事件是围绕浏览器本地事件的跨浏览器包装。它为开发人员提供了更多控制权,并使添加标准本机事件中不存在的额外功能成为可能,例如添加额外的数据(如David Walsh的文章中所建议的)。

合成事件的另一种用法是创建事件的池,因此您可以重用事件,而不必从头开始创建它们。 React is using that method在幕后。

答案 2 :(得分:2)

这是一个笼统的解释,但我认为了解事件驱动的体系结构背后的想法很有用。

TL; DR

如果希望某人对程序进行扩展,则可以使用自定义事件,否则根据他们的需要;通常这发生在某种框架级别,您无法预测应用程序的最终行为。


事件具有与之相关的三个部分-定义,触发和附加。

浏览器公开了许多内置事件,例如> git config --type=bool --get-urlmatch http.sslVerify https://gitlab.dev false 等,可用于自定义浏览器的行为。在这里,“定义”和“触发”部分由浏览器(开发人员)为您完成。您作为消费者,可以通过向其添加功能来对其进行扩展。

那么,为什么浏览器想到创建一个事件并将其命名为onload?为什么不能叫onload?因为浏览器希望为您提供功能,以使其能够扩展您选择的任何功能;它可以给出的最佳名称 onload ,因为这就是幕后故事!您可以神奇在程序中任何地方附加它,以修改浏览器的行为-因为浏览器已编程为调用附加到它的任何内容。这种无处不在使它变得超级容易和有用。不能猜到fetchMySuperContent是您想要做的。还有其他人可以做些其他事情。

我想您可以说这也是自定义事件的目的;除了这里的作者是框架开发人员,而消费者是您或我想要扩展它的人。

这是间接功能和关注分离功能的一个很好的例子。

答案 3 :(得分:1)

创建自定义事件使您可以访问具有其自己的属性和方法的事件对象。如果不需要使用这些属性或方法,则应调用常规函数,并且不要将其作为自定义事件触发。

以下是事件的文档,用于指定属性和方法: Events in MDN