第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

通過(guò) createElement 創(chuàng)建 WebComponent

通過(guò) createElement 創(chuàng)建 WebComponent

我在使用 createElement 創(chuàng)建 Web 組件時(shí)遇到問(wèn)題。我收到此錯(cuò)誤:未捕獲的 DOMException:無(wú)法構(gòu)造“CustomElement”:結(jié)果在 appendTodo 中不能有子項(xiàng)class TodoCard extends HTMLElement {    constructor() {        super()        this.innerHTML = `            <li>                <div class="card">                    <span class="card-content">${this.getAttribute('content')}</span>                    <i class="fa fa-circle-o" aria-hidden="true"></i>                    <i class="fa fa-star-o" aria-hidden="true"></i>                </div>            </li>        `    }}window.customElements.define('todo-card', TodoCard)const todoList = document.getElementById('todo-list')const todoForm = document.getElementById('todo-form')const todoInput = document.getElementById('todo-input')function appendTodo(content) {    const todo = document.createElement('todo-card')    todo.setAttribute('content', content)    todoList.appendChild(todo)}todoForm.addEventListener('submit', e => {    e.preventDefault()    appendTodo(todoInput.value)    todoInput.value = ''})有任何想法嗎?謝謝。
查看完整描述

1 回答

?
慕田峪9158850

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超8個(gè)贊

constructor

永遠(yuǎn)無(wú)法創(chuàng)建在中設(shè)置 DOM 內(nèi)容的自定義元素document.createElement()


您將看到許多示例(包括我的示例),其中 DOM 內(nèi)容是在構(gòu)造函數(shù)中設(shè)置的。

這些元素永遠(yuǎn)無(wú)法創(chuàng)建document.createElement


說(shuō)明(HTML DOM API):

當(dāng)您使用時(shí):


  <todo-card content=FOO></todo-card>

該元素(從 HTMLElement 擴(kuò)展)具有所有 HTML 接口(它在 HTML DOM 中),

您可以在構(gòu)造函數(shù)中設(shè)置 innerHTML


但是,當(dāng)你這樣做時(shí):


  document.createElement("todo-card");

構(gòu)造函數(shù)在沒(méi)有 HTML 接口的情況下運(yùn)行(元素可能與 DOM 無(wú)關(guān)),因此在構(gòu)造函數(shù)

中設(shè)置 innerHTML會(huì)產(chǎn)生錯(cuò)誤:


未捕獲的 DOMException:無(wú)法構(gòu)造“CustomElement”:結(jié)果不得有子項(xiàng)


來(lái)自https://html.spec.whatwg.org/multipage/custom-elements.html#custom-element-conformance:


該元素不得獲得任何屬性或子元素,因?yàn)檫@違反了使用 createElement 或 createElementNS 方法的消費(fèi)者的期望。一般來(lái)說(shuō),工作應(yīng)該盡可能推遲到 connectedCallback


shadowDOM 是一個(gè) DOM

使用shadowDOM時(shí),您可以在構(gòu)造函數(shù)中設(shè)置shadowDOM內(nèi)容:


  constructor(){

    super().attachShadow({mode:"open"})

           .innerHTML = `...`;

  }

正確的代碼(沒(méi)有 shadowDOM):使用connectedCallback:

<todo-card content=FOO></todo-card>


<script>

  window.customElements.define(

    "todo-card",

    class extends HTMLElement {

      constructor() {

        super();

        //this.innerHTML = this.getAttribute("content");

      }

      connectedCallback() {

        this.innerHTML = this.getAttribute("content");

      }

    }

  );


  try {

    const todo = document.createElement("todo-card");

    todo.setAttribute("content", "BAR");

    document.body.appendChild(todo);

  } catch (e) {

    console.error(e);

  }

</script>

您還有另一個(gè)小問(wèn)題:content 默認(rèn)屬性,F(xiàn)ireFox 不會(huì)停止警告您:

http://img1.sycdn.imooc.com//638964ee0001f6fa05700020.jpg

或者不使用 createElement

  const todo = document.createElement("todo-card");

  todo.setAttribute("content", "BAR");

  document.body.appendChild(todo);

可以寫成:


  const html = `<todo-card content="BAR"></todo-card`;

  document.body.insertAdjacentHTML("beforeend" , html); 

可以connectedCallback運(yùn)行多次!

當(dāng)你四處移動(dòng) DOM 節(jié)點(diǎn)時(shí):


<div id=DO_Learn>

  <b>DO Learn: </b><todo-card todo="Custom Elements API"></todo-card>

</div>

<div id="DONT_Learn">

  <b>DON'T Learn!!! </b><todo-card todo="React"></todo-card>

</div>

<script>

  window.customElements.define(

    "todo-card",

    class extends HTMLElement {

      connectedCallback() {

        let txt = this.getAttribute("todo");

        this.append(txt);// and appended again on DOM moves

        console.log("qqmp connectedCallback\t", this.parentNode.id, this.innerHTML);

      }

      disconnectedCallback() {

        console.log("disconnectedCallback\t", this.parentNode.id , this.innerHTML);

      }

    }

  );

  const LIT = document.createElement("todo-card");

  LIT.setAttribute("todo", "Lit");

  DO_Learn.append(LIT);

  DONT_Learn.append(LIT);

</script>

  • LIT 的 connectedCallback 運(yùn)行

  • 移動(dòng) LIT 時(shí)

  • disconnectedCallback 運(yùn)行(注意父級(jí)!元素已經(jīng)在新位置)

  • LIT 的 connectedCallback 再次運(yùn)行,再次"Learn Lit" 追加

這取決于你的程序員你的組件/應(yīng)用程序必須如何處理這個(gè)

Web 組件庫(kù)

像 Lit、HyperHTML 和 Hybrids 這樣的庫(kù)實(shí)現(xiàn)了額外的回調(diào)來(lái)幫助解決所有這些問(wèn)題。

我建議先學(xué)習(xí)自定義元素 API,否則你學(xué)習(xí)的是工具而不是技術(shù)。

有工具的傻瓜,仍然是傻瓜


查看完整回答
反對(duì) 回復(fù) 2022-12-02
  • 1 回答
  • 0 關(guān)注
  • 169 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)