javascript - 如何获取自定义元素的内容

标签 javascript html web-component

我正在创建一个 custom element这将能够将其内容从 Markdown 转换为 HTML。但是,我无法获取自定义元素的内容。

<!doctype html>
<html>
<body>
   <template id="mark-down">
      <div class="markdown"></div>
   </template>
   <!-- Converts markdown to HTML -->
   <script src="https://cdn.jsdelivr.net/gh/showdownjs/showdown/dist/showdown.js"></script>
   <script>
      customElements.define('mark-down',
         class extends HTMLElement {
            constructor() {
               super()
               let template = document.querySelector('#mark-down').content
               this.attachShadow({ mode: 'open' }).appendChild(template.cloneNode(true))
            }
            connectedCallback() {
               console.log(this) // Returns the whole <mark-down> node and its contents
               console.log(this.innerHTML) // So why does this return a blank string?
               // This should theoretically work --> let markdown = this.innerHTML
               let markdown = '## Test'
               let converter = new showdown.Converter()
               let html = converter.makeHtml(markdown)
               this.shadowRoot.innerHTML = html;
            }
         });
   </script>

   <main>
      <mark-down>
## Our Markdown

These contents should get converted

* One
* Two
* Three
      </mark-down>
   </main>
</body>
</html>

我的问题在 connectedCallback() .登录时 this , 我得到了整个 <mark-down>其内容在 Markdown 中的节点。但是,它似乎没有有效的属性。使用 innerHTML返回一个空白,它应该返回 Markdown ;其他组合,例如 this.querySelector('mark-down') , 返回 null .
如何获取自定义元素的内容?

最佳答案

我被咬了这个说了这么多,我特意问了一个 StackOverflow 问题让大家找
wait for Element Upgrade in connectedCallback: FireFox and Chromium differences
最简单的解决方法是 setTimeoutconnectedCallback

<script>
  customElements.define('my-element', class extends HTMLElement {
    connectedCallback() {
      console.log(this.innerHTML);// "" in all Browsers
      setTimeout(() => {
        // now runs asap 
        console.log(this.innerHTML); // "A"
      });
    }
  })
</script>

<my-element>A</my-element>
这个和所有提到的变通办法所做的是推迟代码执行,直到 DOM 被完全解析。setTimeoutDOMContentLoaded 之后运行, 但是如果你换行 一切DOMContentLoaded整个元素创建延迟,同样适用于 defer或放置<script>在您的页面末尾
Supersharp 解释了为什么更好:
wait for Element Upgrade in connectedCallback: FireFox and Chromium differences

关于javascript - 如何获取自定义元素的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62962138/

相关文章:

javascript - 如何从导入的 html 中的脚本访问导入的 html 的元素

javascript - 在 JQuery 中创建动态创建元素的事件

javascript - 宽度缩放时透视变换不缩放?

javascript - innerHTML 正在更改输入的值

javascript - 文本节点可以开槽吗?

javascript - 如何获取href属性的值

javascript - 使用 PageContainer 动态加载面板

javascript - 如何在 JavaScript 中正确引用 Oracle SQL 字符串

javascript - 使用javascript隐藏div元素

javascript - 在 Canvas 图像上绘制图标