gpt4 book ai didi

javascript - 在 native JavaScript 中双向反射(reflect)自定义 HTMLInput 元素中的属性和属性

转载 作者:行者123 更新时间:2023-11-30 14:08:19 25 4
gpt4 key购买 nike

我有一个继承自 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;
}
}

我可以做到以下几点:

  1. 在输入框里输入“test”

    (tb.value && tb.value..attributes["value"])==="test

  2. 改变属性值改变属性

tb.attributes["value"].value ="test"-> tb.value ==="test"

但我不能做以下事情:

tb.value = "test" -> tb.attributes["value"] === "test";

我认为解决方案是覆盖类的get value() 和set value(value)。但我没有成功。

最佳答案

你不应该这样做,因为它会改变 <input> 的默认行为。元素,它是来自 value 的单向绑定(bind)属性为 value属性(property)。

无论如何,你需要重载 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>

注意:这是一个不检查数据类型的简单示例。

关于javascript - 在 native JavaScript 中双向反射(reflect)自定义 HTMLInput 元素中的属性和属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54944895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com