在本机 JavaScript 中双向反映自定义 HTMLInput 元素中的 属性 和属性
Reflecting the property and attribute in a custom HTMLInput Element in both directions in native JavaScript
我有一个继承自 HTMLInputElement
的自定义输入框:
class TB extends HTMLInputElement {
static get observedAttributes() {
return ['value'];
}
constructor() {
super();
this.addEventListener("change", function (event) {
this.setAttribute('value', this.value);
});
}
connectedCallback() {
this.setAttribute('value', this.value);
}
attributeChangedCallback(name, oldValue, newValue) {
this.value = newValue;
}
}
我可以做到以下几点:
输入"test"
(tb.value && tb.value..attributes["value"])==="test
改变属性值改变属性
tb.attributes["value"].value ="test" -> tb.value ==="test"
但我无法执行以下操作:
tb.value = "test" -> tb.attributes["value"] === "test";
我认为解决方案是覆盖 class 的 get value() 和 set value(value)。但是我没有成功。
你不应该这样做,因为它会改变 <input>
元素的默认行为,这是从 value
属性到 value
的单向绑定属性.
无论如何,您需要重载 value
setter 和 getter 以及 super
,注意不要在 2 个更新中创建无限循环.
class TB extends HTMLInputElement {
static get observedAttributes() { return ['value'] }
constructor() {
super()
this.addEventListener( 'input', () => this.setAttribute( 'value', super.value ) )
}
attributeChangedCallback(name, oldValue, newValue) {
this.value = newValue
}
get value() { return super.value }
set value( val ) {
super.value = val
if ( val != this.getAttribute( 'value' ) )
this.setAttribute( 'value', val )
}
}
customElements.define( 'my-input', TB, { extends: 'input' } )
<input is="my-input" value="test" id=IN>
注意:这是一个不检查数据类型的简单示例。
我有一个继承自 HTMLInputElement
的自定义输入框:
class TB extends HTMLInputElement {
static get observedAttributes() {
return ['value'];
}
constructor() {
super();
this.addEventListener("change", function (event) {
this.setAttribute('value', this.value);
});
}
connectedCallback() {
this.setAttribute('value', this.value);
}
attributeChangedCallback(name, oldValue, newValue) {
this.value = newValue;
}
}
我可以做到以下几点:
输入"test"
(tb.value && tb.value..attributes["value"])==="test
改变属性值改变属性
tb.attributes["value"].value ="test" -> tb.value ==="test"
但我无法执行以下操作:
tb.value = "test" -> tb.attributes["value"] === "test";
我认为解决方案是覆盖 class 的 get value() 和 set value(value)。但是我没有成功。
你不应该这样做,因为它会改变 <input>
元素的默认行为,这是从 value
属性到 value
的单向绑定属性.
无论如何,您需要重载 value
setter 和 getter 以及 super
,注意不要在 2 个更新中创建无限循环.
class TB extends HTMLInputElement {
static get observedAttributes() { return ['value'] }
constructor() {
super()
this.addEventListener( 'input', () => this.setAttribute( 'value', super.value ) )
}
attributeChangedCallback(name, oldValue, newValue) {
this.value = newValue
}
get value() { return super.value }
set value( val ) {
super.value = val
if ( val != this.getAttribute( 'value' ) )
this.setAttribute( 'value', val )
}
}
customElements.define( 'my-input', TB, { extends: 'input' } )
<input is="my-input" value="test" id=IN>
注意:这是一个不检查数据类型的简单示例。