【问题标题】:Difference between constructor and connectedCallback in custom elements v1自定义元素 v1 中构造函数和 connectedCallback 的区别
【发布时间】:2017-03-22 09:34:51
【问题描述】:

我是 Web 开发的新手,最近我看到很多关于自定义元素 v1 的辩论和讨论。它们允许您使用自己的自定义行为定义自己的元素,如果使用 Shadow DOM,则使用范围样式。

当我在this 网站上了解它时,我没有理解“自定义元素反应”下的表格。谁能解释使用“构造函数”和“connectedCallback”以及“创建或升级”和“插入 DOM”这两个术语之间的区别?

有关额外信息,我的自定义元素的定义在一个单独的文件中,它使用影子 DOM。我使用 HTML Import 将元素的定义导入到主文档中。

【问题讨论】:

  • 如果您执行 var button = document.createElement('fancy-button') 之类的操作,则会调用构造函数,而仅在执行 document.body.appendChild(button); 后才会调用 connectedCallback也就是说,它被附加到dom中的一个元素上。
  • 如果我们直接在主文档中声明标签为“”呢?
  • 在这种情况下似乎没有真正的区别,除了一个在另一个之前被调用:jsfiddle.net/ddjvxkpd

标签: javascript html web-component shadow-dom custom-element


【解决方案1】:

正如 Juvian 在 cmets 中所述:

  • 当元素创建时调用constructor()
  • connectedCallback() 在元素附加到 DOM 时(之后)被调用。

constructor() 调用并非特定于自定义元素,它发生在任何对象创建(通常使用 new 运算符创建)时,而不仅仅是 HTML 元素。

constructor()调用中,可以创建Shadow DOM,但不能在普通DOM中添加节点,也不能添加或设置属性。

关于升级

升级发生在 HTML 代码中声明的未知标签之后定义(通过customElements.define() 方法)。 “未知”元素成为“自定义”元素。然后调用constructor()connectedCallback() 方法。

注意:当一个元素被创建(未知),然后被定义时,它只有在附加时才会升级。

class CE extends HTMLElement {
  constructor() {
    super()
    console.info( 'constructed' )
  }
  connectedCallback() {
    console.info( 'connected' )
    this.innerHTML = 'Hello'  //can't be set in constructor()
  }
}


B1.onclick = function () {
  ce = document.createElement( 'c-e' )
  ce.textContent = 'unknown'
}

B2.onclick = function () {
  document.body.appendChild( ce )
}

B3.onclick = function () {
  customElements.define( 'c-e', CE)  
}
<button id=B1>create</button>
<button id=B2>attach</button>
<button id=B3>define</button>

用上面的 sn-p 尝试不同的组合:

  • 然后运行:1 创建 - 2 附加 - 3 定义
  • 然后运行:1 创建 - 2 定义 - 3 附加
  • 然后运行:1 定义 - 2 创建 - 3 附加

【讨论】:

  • 目前在 Chrome 中,我可以在构造函数中设置this.innerHTML
  • @kzh 仅当您在渲染后定义自定义元素(即升级未知元素)。这不是更常见的用例,并且不受规范的支持。
  • @Supersharp 有没有一种简单的方法可以将值从 HTML 传递给构造函数?即&lt;button id=B1&gt;create&lt;/button&gt; 然后构造函数可以访问id?仅在连接的回调中查找 id 似乎很愚蠢
  • @BigGuy 也许你应该提出一个问题,我看不出你到底想要什么
  • 现在你也可以在ce连接之前自己拨打CustomElementRegistry.upgrade()customElements.upgrade(ce)
猜你喜欢
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-04
  • 2013-02-03
  • 2013-04-05
  • 1970-01-01
相关资源
最近更新 更多