允许 textarea web 组件接受内部文本

Allow textarea web component to accept inner text

我正在构建一个使用 <textarea> 元素的 Web 组件,但我不知道如何让它像原生 <textarea> 元素一样接受内部文本。

<body>
  <textarea>this works</textarea>
  <expanding-textarea>this doesn't</expanding-textarea>
  <script type="module">
    const template = document.createElement("template");
    template.innerHTML = `<textarea></textarea>`;

    class ExpandingTextarea extends HTMLElement {
      constructor() {
        super();
        this.attachShadow({ mode: "open" });
        this.shadowRoot.appendChild(template.content.cloneNode(true));
      }
    }
    customElements.define("expanding-textarea", ExpandingTextarea);
  </script>
</body>

您需要在构造函数中设置新创建的文本区域的文本内容属性。 我给你做了一个简化版。

class ExpandingTextarea extends HTMLElement {
  constructor() {
    super();
    this.attachShadow({ mode: "open" });
    var textarea = document.createElement("textarea");
    textarea.textContent = this.textContent;
    this.shadowRoot.appendChild(textarea);
  }
}
customElements.define("expanding-textarea", ExpandingTextarea);

有 2 种自定义元素

  • 自主自定义元素(从(根)HTMLElement 扩展,如第一个答案)
  • 自定义内置元素(从现有元素扩展)

因此您可以从 HTMLTextAreaElement 扩展并免费获得所有功能:

  class MyTextArea extends HTMLTextAreaElement {
    constructor() {
      super();
      this.placeholder = 'Type some text';
      this.cols = 60;
      this.rows = 10;
    }
  }

  customElements.define('my-textarea', MyTextArea, { extends: 'textarea' });
<textarea is=my-textarea></textarea>

重要提示:

  • Opera 和 Safari 支持自定义内置元素,但有 polyfill
  • 自定义的内置文本区域(由于其内部工作原理)可以没有 shadowDOM
    大多数其他自定义内置元素可以有一个 shadowDOM
  • 您动态创建自定义内置元素:
    document.createElement( "textarea", {is:"my-textarea"} )
  • Firefox 不正确!! 允许 <my-textarea></my-textarea> 符号,