无法从其构造函数访问自定义元素的属性 [英] Cannot access attributes of a custom element from its constructor
问题描述
我正在尝试使用自定义元素API为游戏内浏览器引擎用来显示按钮和类似内容的自定义元素创建各种填充. 但是,我似乎无法从构造函数中访问元素的属性(例如src,href ...).
这里是一个例子:
class KWButton extends HTMLElement {
constructor() {
super();
var attributes = this.attributes;
var shadow = this.attachShadow({
mode: 'open'
});
var img = document.createElement('img');
img.alt = this.getAttribute('text'); // the getAttribute call returns null
img.src = this.getAttribute('src'); // as does this one
img.width = this.getAttribute('width'); // and this
img.height = this.getAttribute('height'); // and this
img.className = 'vivacity-kwbutton'; // this works fine
shadow.appendChild(img);
img.addEventListener('click', () => {
window.location = this.getAttribute('href'); // this works perfectly fine
});
}
}
customElements.define('kw-button',
KWButton);
<kw-button src="https://placekitten.com/g/198/39" width="198" height="39" icon_src="https://placekitten.com/g/34/32" icon_width="34" icon_height="32" href="https://placekitten.com/" text="placekiten" color="#ffffff" size="18"></kw-button>
您不能使用querySelector()
和appendChild()
以及constructor()
中的getAttribute()
和setAttribute()
访问元素DOM树. /p>
这是因为在调用constructor()
时,自定义元素尚无内容.
您应该在connectedCallback()
方法中将其推迟,这会没事的.
来自规范:
该元素不得获得任何属性或子元素,因为这违反了使用createElement或createElementNS方法的消费者的期望.
通常,应将工作尽可能推迟到connectedCallback
I'm trying to create a polyfill of sorts using the Custom Elements API for custom elements used by an in-game browser engine to display buttons and similar. However, I can't seem to access the element's attributes (eg. src, href ...) from within the constructor.
Here is an example:
class KWButton extends HTMLElement {
constructor() {
super();
var attributes = this.attributes;
var shadow = this.attachShadow({
mode: 'open'
});
var img = document.createElement('img');
img.alt = this.getAttribute('text'); // the getAttribute call returns null
img.src = this.getAttribute('src'); // as does this one
img.width = this.getAttribute('width'); // and this
img.height = this.getAttribute('height'); // and this
img.className = 'vivacity-kwbutton'; // this works fine
shadow.appendChild(img);
img.addEventListener('click', () => {
window.location = this.getAttribute('href'); // this works perfectly fine
});
}
}
customElements.define('kw-button',
KWButton);
<kw-button src="https://placekitten.com/g/198/39" width="198" height="39" icon_src="https://placekitten.com/g/34/32" icon_width="34" icon_height="32" href="https://placekitten.com/" text="placekiten" color="#ffffff" size="18"></kw-button>
You cannot access the element DOM tree with querySelector()
and appendChild()
, and attributes with getAttribute()
and setAttribute()
in the constructor()
.
It's because at the time constructor()
is called the custom element has no content yet.
You should defer that in the connectedCallback()
method and it will be fine.
From the specs:
The element must not gain any attributes or children, as this violates the expectations of consumers who use the createElement or createElementNS methods.
In general, work should be deferred to connectedCallback as much as possible
这篇关于无法从其构造函数访问自定义元素的属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!