【发布时间】:2022-06-10 20:27:34
【问题描述】:
我有一个用于多个安装的发布/订阅框架。
该框架使用jQuery().trigger() 和jQuery().on() 并且在大多数安装中都能正常工作。
但是,有些安装会导致系统崩溃,可能是因为某些代码停止了传播。
使用纯 JavaScript,我可以创建不可取消的事件,如下所示:
const myEvent = new Event("customLoad", {cancelable: false})
document.dispatchEvent(myEvent)
如果可能的话,我想继续使用 jQuery。有没有办法以某种方式使 jQuery 事件不可取消?
我试过.triggerHandler()。但它并没有像我的情况那样冒泡。
所以在我的情况下,我像这样使用 pub/sub:
jQuery(document).trigger("customLoad")
jQuery(window).on("customLoad")
有没有可能是一些stopPropagation() 在干扰?
简单的解决方案是将window 更改为document in jQuery(window).on("customLoad")
编辑:
我发现了问题所在。有问题的 WordPress 网站的主题开发人员再次加载 jQuery,即使 WordPress 已经加载了当前版本的 jQuery。在我的代码注册事件后,主题会加载 jQuery。
我不确定在注册事件后再次加载 jQuery 时会发生什么。但我猜有些引用会被覆盖。
【问题讨论】:
-
我认为您可能会混淆
stopPropagation()和preventDefault(),我认为事件的可取消状态不会影响该事件是否可以传播到父元素。 -
@DBS:我刚刚玩过domevents.dev,它发现了相同的结果。如果停止传播,则无法克服使事件不可取消的问题。所以没有办法解决
stopPropagation()? -
如果不知道你的代码/事件做了什么,很难给出任何详细的例子,但是:如果你在它被触发的元素上监听事件(而不是,例如
document)它赢了'无需传播即可到达您的侦听器,并且不应受到附加到父元素的侦听器的影响。 -
那个事件是在
document,就像上面的例子一样。 -
我刚刚添加了更多上下文。简单的解决方案是将
window中的document更改为jQuery(window).on("customLoad")吗?
标签: jquery