【问题标题】:Creating custom node to extend HTMLIFrameElement创建自定义节点以扩展 HTMLIFrameElement
【发布时间】:2018-11-26 12:18:45
【问题描述】:

是否可以创建一个自定义元素,例如:"",并且这个新元素将具有 iframe 元素的所有功能? (它自己的文档/窗口对象等......)?

【问题讨论】:

  • 普通 iframe 不够用的任何原因?
  • @Shilly 我想为我正在创建的特殊元素添加更多功能,我需要它像 iframe(带有文档/窗口对象)
  • 您可以尝试摆弄document.registerElement() 并克隆 iframe 原型,但我不能保证它适用于 iframe 开箱即用的所有功能。这听起来确实是一件不平凡的工作。想解释一下自定义元素可以解决哪些普通 iframe 无法解决的问题?
  • @Shilly 当我使用 HTMLIFrameElement 而不是 HTMLElement 时出现错误——“未捕获的类型错误:非法构造函数:自主自定义元素必须扩展 HTMLElement”

标签: javascript custom-element


【解决方案1】:

扩展<iframe>

要扩展标准 HTML 元素,您必须在 customElements.define() 方法中使用 { extends: "element" }

class MyFrame extends HTMLIFrameElement {
    constructor () {
        super()
        console.log( 'created')
    }
}
customElements.define( 'my-frame', MyFrame, { extends: 'iframe' } )

然后使用is="custom-element"属性创建扩展元素:

<iframe is='my-frame'></iframe>

然后您可以将其用作标准 &lt;iframe&gt; 并添加您的自定义功能。


定义一个新的 HTML 标签

Alternaltey,如果您想要一个新的标签名称,请创建一个自治自定义元素(源自 HTMLElement),其中包含标准 &lt;iframe&gt; 元素:

class NewFrame extends HTMLElement {
  constructor() {
    super()
    console.log( 'created' ) 
    this.attachShadow( { mode: 'open' } )
        .innerHTML = "<iframe></iframe>"
  }
  connectedCallback() {
    setTimeout( () =>
      this.shadowRoot.querySelector( 'iframe' ).contentDocument.body.innerHTML = this.innerHTML
    )
  }
}
customElements.define( 'new-frame', NewFrame )

在本例中,自定义元素将使用&lt;new-frame&gt; 的内容来填充&lt;iframe&gt; 文档。

<new-frame>Hello world !</new-frame>

此解决方案的缺点是您的新元素不会充当&lt;iframe&gt;。您必须为要转发到 &lt;iframe&gt; 内部的所有功能定义一些自定义方法。

【讨论】:

  • 谢谢!任何机会我也可以更改标签名称?还是不可能?
  • @avidahan 不,如果你想要一个新的标签名称,你需要创建一个自治的自定义元素,并在其中添加一个
  • 你能举个例子吗?
  • @avidahan 我添加了一个替代示例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
  • 2014-09-02
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多