Расширить возможности класса для установки DOM элементу атрибутов

Определил Класс Form. Объявил в нем метод, в котором создаю элемент и добавляю ему нужные css-классы. Не хватает ума сделать так, чтобы Класс при необходимости мог создавать атрибуты у элемента. К примеру, делаю инстанс Класса, передаю ему метод createInput(), создавая тем самым DOM элемент (инпут к примеру). Теперь хочу созданному инпуту добавить атрибут, а через 2 дня добавить id. Возможно ли такую логику прописать в Классе т.е. атрибуты или id или data-set создаются у элемента когда это необходимо. но могут и не создаваться. А потом мы просто наследуемся от Класса в случае необходимости создать новый DOM элемент.

class Form {
    constructor(element, ...classNames) {
      this.element = element
      this.classNames = classNames
    }
    createItem() {
      const element = document.createElement(this.element)
      element.classList.add(...this.classNames)
      return element
    }
    
   }
  
 let item = new Form('input', 'form-style', 'form-style2', 'form-style3')
 document.body.append(item.createItem());

Ответы (1 шт):

Автор решения: eccs0103

Уточнение

В DOM уже встроено способ для создания пользовательских элементов и способ этот полностью поддерживаться создателями DOM. И что бы вы не создали, не превзойдет уже встроенный создателями вариант. Поэтому я предлагаю такое решение.


Для создания пользовательских элементов в DOM, существуют следующие способы:

1. Новые элементы

Абсолютно новый элемент который не похож ни на одну из встроенных элементов HTML.
Создается класс, который наследуется от HTMLElement и зарегистрируется с помощью customElements.define():

class MyTagElement extends HTMLElement {
  connectedCallback() {
    this.innerText += `Я пользовательский элемент\n`;
    this.innerText += `Мой id - ${this.id}\n`;
    this.innerText += `Мои аттрибуты: - ${[...this.attributes].map(attr => attr.name).join(`, `)}\n`;
    this.innerText += `Мои классы: - ${[...this.classList].join(`, `)}\n`;
  }
}

customElements.define(`my-tag`, MyTagElement);
<my-tag id="my-id" class="my-class" attribute="my-attribute"></my-tag>

Новые элементы поддерживают стандартные свойства и методы обычных элементов в DOM, в том числе id, class, style и другие аттрибуты.

2. Измененные элементы

Элементы, которые модифицируют / улучшают какой-то функционал уже встроенных элементов.
Измененные элементы наследуются от встроенных классов и при регистрации отмечаются с помощью { extends: `` }:

class MyParagraphElement extends HTMLParagraphElement {
    connectedCallback() {
        this.innerText = `Я дополнение к тегу <p>, который изначально дает ему текст.`;
    }
}

customElements.define(`my-p`, MyParagraphElement, { extends: `p` });
<p is="my-p"></p>

Измененные элементы поддерживают стандартные свойства и методы наследуемого элемента и выполняют функционал не меньше, чем наследуемый элемент.


Для "жизнеобеспечения" пользовательских элементов используются специальные методы:

  • connectedCallback() вызывается каждый раз, когда пользовательский элемент HTML добавляется в DOM.
  • disconnectedCallback() вызывается каждый раз, когда пользовательский элемент HTML удаляется из DOM.
  • adoptedCallback() вызывается каждый раз, когда пользовательский элемент HTML перемещается в новый элемент.
  • attributeChangedCallback() вызывается при каждом изменении (добавлении, изменении значения или удаления) атрибута пользовательского элемента HTML.

А название пользовательских элементов принято писать через тире, чтобы не конфликтовали со встроенными, в новых версиях HTML.

→ Ссылка