Как создавать собственные элементы в HTML по требованию?

В настоящее время я добавляю некоторые пользовательские элементы для собственной структуры, однако я заметил, что мы получаем все элементы из индексного файла, чтобы использовать их внутри html.

Знаете ли вы лучший способ сделать это? как ленивое создание экземпляра.

текущий код:

customElements.define('element-a', ElementA);
customElements.define('element-b', ElementB);
customElements.define('element-c', ElementC);
customElements.define('element-d', ElementD);
customElements.define('element-f', ElementF);
....

Я не могу понять, какой вопрос вы задаете. Javascript, безусловно, может создавать элементы HTML «на лету», и я предполагаю, что именно это и делает ваш код.

Tim Roberts 28.05.2024 00:24

Я хочу, чтобы это было по требованию, я нашел «способ» сделать это аннотацией для каждого класса, но это не по требованию, я хотел бы знать, есть ли что-то, что поможет вам проверить документ, посмотреть, нужно ли вам определенный элемент, затем определите его.. как по требованию

Kisama329 28.05.2024 00:30

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

Barmar 28.05.2024 00:34

Вы можете использовать регулярное выражение, которое ищет <\s*element-a\b в тексте HTML. Но это было бы хрупко.

Barmar 28.05.2024 00:35

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

Barmar 28.05.2024 00:36

@Бармар, не мог бы ты объяснить это подробнее?

Kisama329 28.05.2024 00:45

Что еще сказать? Вы не сможете загружать HTML с пользовательскими тегами, пока не определите пользовательские элементы. Таким образом, невозможно сделать определение элемента зависимым от уже загруженного HTML-кода.

Barmar 28.05.2024 00:46

Для пользовательских элементов нет автозагрузчика.

Barmar 28.05.2024 00:46

Все Бармары его высказывания неверны!!!. Вот JSFiddle, демонстрирующий, как работают веб-компоненты, когда JavaScript define поступает после этапа анализа DOM. jsfiddle.net/WebComponents/9txjfazc

Danny '365CSI' Engelman 28.05.2024 11:38
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
9
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете найти пользовательские элементы, скрыть их, асинхронно загружать классы и обновлять элементы:

class CustomElement extends HTMLElement{
  connectedCallback() {
    const template = document.createElement("template")
    template.innerHTML = /* html */ `
      <style>
        :host {
          background-color: yellow;
        }
      </style>

      <slot></slot>
    `
    const shadowRoot = this.attachShadow({ mode: "open" })
    shadowRoot.appendChild(template.content.cloneNode(true))
  }
}

const promises = {};

// you can also traverse DOM tree, could be faster
document.querySelectorAll('*').forEach(async el => {
  if (el.tagName.includes('-')){

    let display;
    [{display}, el.style.display] = [el.style, 'none'];
    const tag = el.tagName.toLowerCase();

    const name = tag.replace(/^\w|-\w/gd, m => m.at(-1).toUpperCase());
    
    // use something like import() to load a custom element class
    let defined = true;
    const factory = await (promises[name] ??= (
      defined = false,
      new Promise(r => setTimeout(() => r(eval(name)), 200))
    ));
    
    defined || customElements.define(tag, factory),
    
    el.style.display = display;
  }
});
<custom-element>Custom Element</custom-element><br/>
<custom-element>Second Element</custom-element>

Хорошо, я нашел полезным решение «обхода дерева DOM», о котором вы упомянули. Итак, в основном пройдите по нему, если он найдет имя пользовательского элемента, то определите его. Это помогает во многих отношениях. Спасибо !

Kisama329 28.05.2024 01:06

@Kisama329 Kisama329 я исправил код, чтобы не определять элемент несколько раз

Alexander Nenashev 28.05.2024 01:19

Другие вопросы по теме