我已经搜索了一段时间;但只找到 Polymer 答案;
或者 EventListeners 放在 shadowRoot内部DOM 元素上的答案。
我试图使用本机自定义元素实现的效果:
- 只有获得焦点的元素才应接受(并显示(按键
可以将单击事件附加到shadowRoot,似乎我对"keyup"事件做错了什么。
如果我把EventListener
放在window
所有元素(当然(都会使用相同的关键信息更新。
window.customElements.define('game-toes', class extends HTMLElement {
constructor() {
super().attachShadow({mode:'open'})
.innerHTML = this.tabIndex;
this.addEventListener('keyup',evt=>this.shadowRoot.innerHTML = 'key:'+evt.key);
}
});
game-toes{
display:inline-block;
height:auto;
width:100px;
padding:1em;
border:10px solid green;
}
game-toes:focus {
background-color: lightgreen;
}
<game-toes tabindex=1></game-toes>
<game-toes tabindex=2></game-toes>
<game-toes tabindex=3></game-toes>
你可以像以前一样做,但你需要添加一些额外的代码来使其工作:
function on(el, evt, cb) {
el.addEventListener(evt, cb);
return () => {
el.removeEventListener(evt, cb);
}
}
window.customElements.define('game-toes', class extends HTMLElement {
constructor() {
super()
.attachShadow({mode: 'open'})
.innerHTML = this.tabIndex;
}
connectedCallback() {
this._offKeyup = on(this, 'keyup', evt => {
this.shadowRoot.innerHTML = evt.key;
evt.stopPropagation(); // Prevent the event from leaving this element
});
}
disconnectedCallback() {
this._offKeyup();
}
});
game-toes{
display:inline-block;
height:auto;
width:100px;
padding:1em;
border:10px solid green;
}
game-toes:focus {
background-color: lightgreen;
}
<game-toes tabindex=1></game-toes>
<game-toes tabindex=2></game-toes>
<game-toes tabindex=3></game-toes>
- 您可能希望使用
evt.stopPropagation()
来阻止事件离开组件。 - 您需要在组件本身上添加 eventListener,或者在 shadowRoot 中创建一个能够获取焦点的元素,然后在组件获得焦点时将焦点设置在内部元素上。然后,您应该能够在该内部元素上添加
keyup
事件。 - 最安全的方法是在
connectedCallback
中添加 eventListener 并在disconnectedCallback
中释放它们,除非您从未打算删除组件。
在您的示例中,tabindex
属性设置为自定义元素<game-toes>
,而不是其 Shadow DOM。
因此,您应该改为侦听自定义元素本身上的keyup
事件:
this.addEventListener('keyup',evt=>this.shadowRoot.innerHTML = 'key:'+evt.key);
window.customElements.define('game-toes', class extends HTMLElement {
constructor() {
super();
let shadowRoot=this.attachShadow({mode: 'open'});
shadowRoot.innerHTML = this.tabIndex;
this.addEventListener('keyup',evt=>this.shadowRoot.innerHTML = 'key:'+evt.key);
}
});
game-toes{
display:inline-block;
height:auto;
width:100px;
padding:1em;
border:10px solid green;
}
game-toes:focus {
background-color: lightgreen;
}
<game-toes tabindex=1></game-toes>
<game-toes tabindex=2></game-toes>
<game-toes tabindex=3></game-toes>
或者,如果要在 Shadow DOM 级别侦听keyup
事件,则应在 Shadow DOM 内的元素中设置tabindex
属性。