Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在DOM中需要event.stopPropagation()?这是一种糟糕的建筑模式吗?_Dom_Design Patterns_Architecture_Frontend_Event Bus - Fatal编程技术网

为什么在DOM中需要event.stopPropagation()?这是一种糟糕的建筑模式吗?

为什么在DOM中需要event.stopPropagation()?这是一种糟糕的建筑模式吗?,dom,design-patterns,architecture,frontend,event-bus,Dom,Design Patterns,Architecture,Frontend,Event Bus,在日常前端开发中,我经常使用DOM作为全局事件总线,可以访问客户端应用程序的每个部分 但在我看来,其中有一个“特性”是有害的:任何侦听器都可以阻止通过这个“总线”发出的事件的传播 所以,我想知道,这个功能什么时候会有用。允许一个侦听器“禁用”所有其他侦听器是否明智?如果听众不具备做出正确决策所需的所有信息,该怎么办 Upd 这不是关于“什么是冒泡和捕获”或“Event.stopPropagation实际如何工作”的问题。 这是关于“允许任何订阅者影响事件流的好解决方案”的问题 我们需要(我指的是

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

但在我看来,其中有一个“特性”是有害的:任何侦听器都可以阻止通过这个“总线”发出的事件的传播

所以,我想知道,这个功能什么时候会有用。允许一个侦听器“禁用”所有其他侦听器是否明智?如果听众不具备做出正确决策所需的所有信息,该怎么办

Upd

这不是关于“什么是冒泡和捕获”或“Event.stopPropagation实际如何工作”的问题。 这是关于“允许任何订阅者影响事件流的好解决方案”的问题

我们需要(我指的是当前在JS中的用法)
stopPropagation()
来防止侦听器相互干扰。然而,这不是强制性的

避免停止播放的实际原因:

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

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

  • 但假设您在容器元素上放置了一个神奇的侦听器,每次单击都会触发它来执行一些神奇的操作。magic listener只知道magic,而不知道文档(至少在它变魔术之前)。它做了一件事。在这种情况下,让它只知道魔术是一个很好的设计选择

    如果有一天您需要防止某个特定区域中的单击触发此魔术,因为向魔术侦听器公开特定于文档的区别是不好的,那么明智的做法是防止在其他地方传播

    一个更好的解决方案是(我认为)使用一个监听器来决定是否需要调用magic函数,而不是magic函数是一个可停止的监听器。这样,您可以在不公开任何内容的情况下保持干净的逻辑


    为订阅者提供一种影响流量的方式(我指的是API设计)并没有错;这取决于此功能的需求。它可能对使用它的开发人员有用。例如,
    stopPropagation
    对很多人都很有用


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

    我认为这个问题最好继续问下去。关于“什么是更好的/更坏的/最好的”这是一个相当广泛的话题