Extender HTMLSelectElement

Sep 02 2020

Recientemente, intenté extender un HTMLSelectElement en lugar de crear un elemento nuevo, por razones semánticas y de accesibilidad, es decir:
 let customSelect = function () {
  customElements.define(
    "custom-select",
    class CustomSelect extends HTMLSelectElement {
      connectedCallback() {
        this.attachShadow({ mode: "open" });
        this.shadowRoot.innerHTML = `
      test
      `;
      }
    },
    { extends: "select" }
  );
};

export default customSelect;

Devolvió el siguiente error: custom-select.js: 6 DOMException no detectada: no se pudo ejecutar 'attachShadow' en 'Element': este elemento no es compatible con attachShadow.

Ok, eso era predecible.

Como no puedo trabajar con shadow-dom, mi pregunta es ¿cuál es la mejor solución a partir de ahí?
Hasta ahora, puedo imaginar:

  • Trabajando directamente con el innerHTML de este componente.
  • Creando ese nuevo elemento para trabajar con shadow dom.
  • ¿Reemplazando la sombra existente? (Si tal método pudiera existir).

Entonces, ¿qué tienes en mente es la solución más simple y 'amigable con SEO'?
nb: la solución debe estar basada en elementos personalizados

Respuestas

Supersharp Sep 03 2020 at 17:42

Trabajando directamente con el innerHTML de este componente.

Es la solución "más sencilla y 'compatible con SEO'".


Creando ese nuevo elemento para trabajar con shadow dom.

Potencialmente el más fácil de usar, ya que puede definir una interfaz de usuario mejorada.


¿Reemplazando la sombra existente?

Imposible. Es de solo lectura.


Ejemplo de .