在您的情况下,您不能insertAjacentHTML()
在 Shadow DOMshadowRoot
属性上使用,因为 Shadow Root 没有实现 Element 接口。
使用绑定(这个)
更好的解决方案是在属性上使用appendChild(
) 。shadowRoot
但是,您需要在事件回调上添加一个特殊bind()
操作。click
在事件回调中,这确实引用了触发事件的元素,而不是定义回调的对象。
为了获得对自定义元素的引用(为了访问 Shadow DOM 中的输入元素shadowRoot
,请调用bind(this)
inside addEventListener()
。
button.addEventListener( "click", this.addDiv.bind( this ) )
请参阅下面的完整示例:
const template = document.createElement("template");
template.innerHTML = `<input type="text"></input><button>add div</button>`;
class MyElement extends HTMLElement {
constructor() {
super();
this._shadowRoot = this.attachShadow({ mode: "open" });
this._shadowRoot.appendChild(template.content.cloneNode(true));
const button = this._shadowRoot.querySelector("button");
button.addEventListener("click", this.addDiv.bind( this ) );
}
addDiv(e) {
var div = document.createElement( 'div' )
div.textContent = this.shadowRoot.querySelector( 'input' ).value
this.shadowRoot.appendChild( div )
}
}
customElements.define("my-element", MyElement);
<my-element></my-element>
使用箭头功能
另一种解决方案应该是使用箭头函数。使用箭头函数, this 不会被重新定义,所以你不需要使用bind()
.
class MyElement extends HTMLElement {
constructor() {
super()
const sh = this.attachShadow( { mode: "open" } )
sh.innerHTML = `<input type="text"></input><button>add div</button>`
const button = sh.querySelector( "button" )
button.onclick = ev => {
let div = document.createElement( "div" )
div.textContent = sh.querySelector( "input" ).value
sh.appendChild( div )
}
}
}
customElements.define( "my-element", MyElement )
<my-element></my-element>