【问题标题】:Custom Elements do not fire inline custom events自定义元素不会触发内联自定义事件
【发布时间】:2021-08-22 07:21:50
【问题描述】:

我尝试使用以下代码从自定义元素中捕获内联自定义事件。我在日志上只得到了“外部成功”,从来没有得到“内联成功”。

有什么想法吗?谢谢。

注意:我也尝试将 HTMLELement 替换为 HTMLDivElement/is: 相同的结果

customElements.define(
'test-it',class extends HTMLElement {
  connectedCallback() {
    this.children[0].addEventListener('click', e=>this.dispatchEvent(new CustomEvent('testevent', {detail:'test'})))
  };
}
);

document.getElementsByTagName('test-it')[0].addEventListener('testevent', ()=>{console.log('external success')});
<test-it id="test" ontestevent="console.log('inline success');">
  <div>Minimal test</div>
</test-it>

【问题讨论】:

标签: javascript inline custom-element custom-events


【解决方案1】:

感谢BOZ,使用以下添加,但自定义事件detail 丢失(代码已更新)。

if ( this.ontestevent ) this.ontestevent(); else eval(this.getAttribute('ontestevent'));

customElements.define(
'test-it',class extends HTMLElement {
  connectedCallback() {
    this.children[0].addEventListener(
      'click', 
      e=>{
        this.dispatchEvent(new CustomEvent('testevent', {detail:'test'}));
        if ( this.ontestevent ) this.ontestevent(); else eval(this.getAttribute('ontestevent'));
    })
  };
}
);

document.getElementsByTagName('test-it')[0].addEventListener('testevent', (e)=>{console.log('external success:'+e.detail)});
<test-it ontestevent="console.log('inline success:'+e.detail);">
  <div>Minimal test</div>
</test-it>

【讨论】:

    【解决方案2】:

    testevent 不是有效的 HTML5 全局事件处理程序:

    这意味着ontestevent="..." 只是一个属性,而不是一个onEvent 处理程序。

    您可以自己创建这样的处理程序。

    这就是创建addEventListener 的原因

    PS。对于您未来的 Web 组件冒险:从 inside shadowDOM(您现在不使用)发送事件需要 composed:true 用于 CustomEvents 到 escape shadowDOM

    【讨论】:

    • 你可以顺便说一句,从技术上讲,让它工作没问题
    • 我很想看看如何;在 Web 组件中,我更喜欢 inline 处理程序...我的意思是真正的 inline 处理程序,例如 OP 他的符号 without eval trickery。
    • 你已经通过将东西放置到 attrs 来进行评估
    • 那么如何我可以创建自己的全局事件处理程序? &lt;div onhandler="console.log(42)"&gt;
    • 我认为以 on 开头的每个属性都会匹配。但是有一个有限的列表有效。谢谢。
    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多