为什么我们在DOM中需要event.stopPropagation()?是不好的建筑模式?

时间:2016-06-08 09:17:10

标签: dom design-patterns architecture frontend event-bus

在日常的前端开发中,我经常使用DOM作为全局事件总线,可以访问客户端应用程序的每个部分。

但是有一个"功能"在我看来,这可能被认为是有害的:任何听众都可以阻止通过这种" bus"发出的事件的传播。

所以,我想知道这个功能何时有用。允许一个听众禁用"是否明智?所有其他的?如果该听众没有做出正确决定此类行动所需的所有信息怎么办?

UPD

这不是关于"什么是冒泡和捕获" ,或者"事件.stopPropagation如何实际工作"。 这是关于"这是一个好的解决方案的问题,允许任何订户影响事件流程"?

1 个答案:

答案 0 :(得分:3)

当我们想要阻止侦听器互相干扰时,我们需要(我在讨论JS中的当前用法)stopPropagation()。但是,并非强制要求这样做。

避免stopPropagation的实际理由:

  1. 使用它通常意味着您知道等待同一事件的代码,并干扰当前侦听器的操作。如果是这种情况,那么可能(见下文)是一个设计问题。我们尽量避免在多个不同的地方管理一件事。

  2. 可能有其他侦听器在等待同一类型的事件,而不会干扰当前侦听器的操作。在这种情况下,stopPropagation()可能会成为问题。

  3. 但是,假设您在容器元素上放置了一个魔术监听器,每次点击都会触发它以执行一些魔法。魔术听众只知道魔法,而不是文件(至少不是魔法之前)。它做了一件事。在这种情况下,让它只知道魔法是一个很好的设计选择。

    如果有一天你需要阻止特定区域中的点击激发这种魔力,因为将特定于文档的区别暴露给魔法侦听器是不好的,那么防止传播到其他地方是明智的。

    更好的解决方案虽然可能(我认为)有一个侦听器决定是否需要调用魔术函数,而不是魔术函数是可停止的侦听器。这样你就可以保持一个干净的逻辑,同时什么也不暴露。

    提供(我说的是API设计)一种让订阅者影响流量的方法并没有错;这取决于这个功能的需求。它可能对使用它的开发人员有用。例如,stopPropagation已经(而且)对很多人非常有用。

    有些系统实施continueX方法而不是stopX。在JavaScript中,当被调用者执行某些异步处理(如AJA *请求)时,它非常有用。但是,它不适用于DOM,因为DOM需要及时的结果。我认为stopPropagation是DOM API的一个聪明的设计选择。