Comments 6
this._contents = new DocumentFragment();
this._contents.appendChild(template.content.cloneNode(true));
cloneNode() возвращает DocumentFragment. зачем в первой строке создавать еще один?
Проблема с инлайн-стилями в том, что они не совместимы с CSP. Придется прописать style-src unsafe-inline
, что небезопасно, как видно из названия.
Безопасными их получится сделать, если задавать стили программно, element.style.color = '#f00';
но тогда теряется изящность вашего подхода с template-элементами.
А вообще, интересная тенденция получается. Если есть проблемы с ShadowDOM – просто не используем ShadowDOM. Можно пойти еще дальше и заменить CustomElements на ванильные конструкторы:
new MyWidget(document.querySelector('[data-my-widget]')).render();
и все станет вообще прекрасно. Польза веб-компонентов сильно переоценена.
А вообще, интересная тенденция получается. Если есть проблемы с ShadowDOM – просто не используем ShadowDOM.
Да, в этом все дело: вы сами решаете нужен вам Shadow DOM или нет в каждом конкретном случае.
Можно пойти еще дальше и заменить CustomElements на ванильные конструкторы
Можно. Но селекторы могут быть сильно медленнее и у вас не будет фишек типа disconnectedCallback.
@i360u,Честно говоря, странно, что вы решили использовать атрибут id для идентификации элемента. Если речь идет о переиспользовании HTML-фрагментов, содержимое которых полностью вставляется в DOM, то уж лучше использовать классы или аттрибуты, либо генерируемые id.
А так, идея создавать компоненты без shadowDom очень хорошая. Сам подобную технику использую.
Веб компоненты без Shadow DOM