Вам не нужно расширять HTMLInput.Вот как бы я это сделал.Я добавил все свойства, прикрепленные к <text-box />
, к его внутреннему элементу ввода, но в этом нет необходимости, если только вы не пытаетесь более точно имитировать элемент ввода.
Я надеюсь, что расширение определенных элементов, таких как HTMLInput, выигралоСкоро это не будет проблемой, но я стараюсь их избегать, потому что в момент .
const css = `
<style>
:host([hidden]) { display: none; }
:host {
display: block;
}
input {
background-color: #f5f5f5;
border: 1px solid transparent;
border-radius: 4px;
padding: 1em;
font-size: 16px;
width: 400px;
}
input:focus {
background-color: #fff;
border: 1px solid #dadce0;
outline: 0;
}
</style>
`
const html = `<input type='text' value='Init' />`
class TextBox extends HTMLElement {
static get observedAttributes () {
return ['value']
}
constructor () {
super()
this.attachShadow({mode: 'open'})
this.shadowRoot.appendChild(template.content.cloneNode(true))
// Cache the value of the inputNode
this.inputNode = this.shadowRoot.querySelector('input')
this.inputNode.value = 'Something else'
// Add all properties on text-box to input
for (let i = 0; i < this.attributes.length; i++) {
this.inputNode.setAttribute(
this.attributes[i].nodeName,
this.attributes[i].nodeValue
)
}
}
validate (event) {
console.log('input can be validated')
}
get value () {
return this.inputNode.value
}
set value (newValue) {
this.inputNode.value = newValue
}
connectedCallback () {
this.inputNode.addEventListener('change', this.validate)
}
disconnectedCallback () {
this.inputNode.removeEventListener('change', this.validate)
}
attributeChangedCallback (name, oldValue, newValue) {
if (name === 'value') {
this.inputNode.value = newValue
}
}
}
const template = document.createElement('template')
template.innerHTML = `${css}${html}`
window.customElements.define('text-box', TextBox)
с ними есть некоторые проблемы.