我使用一个带有两个自定义元素(v1)的Web组件制作了一个简单示例,其中一个嵌套在另一个中。index.html:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Example</title> <meta name="description" content=""> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="import" href="app-container.html"> </head> <body> <app-container></app-container> </body> </html>
app-container.html:
<link rel="import" href="toolbar.html"> <template id="app-container"> <app-toolbar></app-toolbar> </template> <script> customElements.define('app-container', class extends HTMLElement { constructor() { super(); let shadowRoot = this.attachShadow({ mode: 'open' }); const content = document.currentScript.ownerDocument.querySelector('#app-container').content; shadowRoot.appendChild(content.cloneNode(true)); } }); </script>
工具栏.html:
<template id="app-toolbar"> <p>Ok!</p> </template> <script> customElements.define('app-toolbar', class extends HTMLElement { constructor() { super(); let shadowRoot = this.attachShadow({ mode: 'open' }); const content = document.currentScript.ownerDocument.querySelector('#app-toolbar').content; shadowRoot.appendChild(content.cloneNode(true)); } }); </script>
但是在toolbar.html document.currentScript中与在app- container.html中相同,因此querySelector('#app-toolbar')无法找到ID为的模板app- toolbar。如何解决这个问题呢?
document.currentScript
querySelector('#app-toolbar')
app- toolbar
示例已在Chrome 55上测试(不使用polyfill)。
document.currentScript包含对当前正在解析和执行的脚本的引用。因此,constructor()从另一个脚本调用该函数时,它不再对您有效 。
constructor()
相反,您应该将其值保存在脚本开头的变量中,并在构造函数中使用此变量:
<script> var currentScript = document.currentScript customElements.define( ... ) ... </script>
如果您有多个脚本,则应使用不同的名称。
或者,您可以将短暂值封装在一个闭包中:
(function(owner) { customElements.define('app-container', class extends HTMLElement { constructor() { super(); let shadowRoot = this.attachShadow({ mode: 'open' }); const content = owner.querySelector('#app-container').content; shadowRoot.appendChild(content.cloneNode(true)); } }); })(document.currentScript.ownerDocument);
在此,将值document.currentScript.ownerDocument分配给在owner调用时仍正确定义的参数constructor()。
document.currentScript.ownerDocument
owner
owner 是本地定义的,因此您可以在其他文档中使用相同的名称。