我可以保护自定义事件免受 "preventDefault" 的影响吗?

Can I protect custom events from "preventDefault"?

我们有一个呈现用户对话框的 Stencil Web 组件。它由一个“outerComponent”和一个“innerComponent”组成。 外层负责处理浏览器(道具、从 cookie 加载内容等),内层呈现实际 HTML 并让用户操作它。

(实际上内部使用了更多组件,来自 UI 组件的不同项目,例如复选框、按钮等。但我认为这与这里无关。)

当在 <inner-component> 中单击复选框、按钮等时,将调用组件内的 onclick-handler 来执行一些 UI 逻辑(例如设置“选中” 属性 ) 然后发出自定义事件,例如:

@Event() checkboxToggleModalEvent: EventEmitter<OptionType>;
...

<checkbox-comp fid="...">
  <input type="checkbox" checked={optionCheckbox.userSelection} onClick={this.handleCheckbox} />
  ...
</checkbox-comp>
...

private handleCheckbox(event: Event) {
    const checkboxElement: HTMLInputElement = event.target as HTMLInputElement;
    ...
    const selection: OptionType = { name: indexId, userSelection };

    this.checkboxToggleModalEvent.emit(selection);
}

现在,在 <outer-component> 中侦听此事件并且处理程序关心“技术”逻辑:

    @Listen("checkboxToggleModalEvent")
    checkboxToggleModalEventHandler(event) {
        LogService.log.debug(event);

        ... some technical logic
    }

这在大多数情况下都可以正常工作。现在我们在一个站点上进行了集成,事件显然没有正确发出或在中间以某种方式丢失。 UI 逻辑正常执行,但永远不会调用 outerComponent 中的处理程序。

我能够从集成库中找到导致问题的代码片段(抱歉粘贴了整个函数!):

// From the imported library on customer website:
function(t, exports) {
    try {
        var e = new window.CustomEvent("test");
        if (e.preventDefault(),
        !0 !== e.defaultPrevented)
            throw new Error("Could not prevent default")
    } catch (t) {
        var n = function(t, e) {
            var n, r;
            return e = e || {
                bubbles: !1,
                cancelable: !1,
                detail: void 0
            },
            n = document.createEvent("CustomEvent"),
            n.initCustomEvent(t, e.bubbles, e.cancelable, e.detail),
            r = n.preventDefault,
            n.preventDefault = function() {
                r.call(this);
                try {
                    Object.defineProperty(this, "defaultPrevented", {
                        get: function() {
                            return !0
                        }
                    })
                } catch (t) {
                    this.defaultPrevented = !0
                }
            }
            ,
            n
        };
        n.prototype = window.Event.prototype,
        window.CustomEvent = n
    }
}

如果我删除它,一切都会按预期进行。

现在,我想知道我们是否可以以某种方式“保护”我们的事件不被这样拦截,因为该组件在任何情况下都应该真正起作用(这就是我们选择这项技术的原因)。

但我也非常感谢任何可能导致问题的提示。

非常感谢!!

  n.prototype = window.Event.prototype,
  window.CustomEvent = n

看起来他们 超载了 CustomEvent 并注入了他们自己的代码。

这是使用第三方软件的缺点。

在这种情况下,解决此问题的唯一方法是 早点进入,并让自己超载 CustomEvent

但是您随后面临着让他们的代码工作的挑战;因为他们这样做是有原因的。

什么是第 3 方软件?公开羞辱他们。

想尝试重载的朋友请尽早执行:

window.customeElements.define = () => {}