微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

自定义元素不会触发内联自定义事件

如何解决自定义元素不会触发内联自定义事件

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

有什么想法吗?谢谢。

注意:我也尝试用 HTMLdivelement/is 替换 HTMLELement:相同的结果

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>

解决方法

http:// xx.xxx.xx.xx:8050 不是有效的 HTML5 全局事件处理程序:

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

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

这就是创建 onEvent 的原因

附注。对于您未来的 Web 组件冒险:从 inside shadowDOM 发送事件(您现在没有使用)需要 addEventListener for CustomEvents escape shadowDOM

,

感谢 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>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。