Вы смешали определения автономного пользовательского элемента (он же новый HTML-тег) с настраиваемым встроенным элементом (он же стандартное расширение HTML-элемента), который имеет немного другой синтаксис.
Для Автономный пользовательский элемент :
class NoCE extends HTMLElement
...
customElements.define( 'no-ce', NoCE )
...
<no-ce><no-ce>
Для Настроенный встроенный <div>
Элемент :
class NoCE extends HTMLDivElement
...
customElements.define( 'no-ce', NoCE, { extends: 'div'} )
...
<div is='no-ce'></div>
Safari не реализует настроенные элементы buit-it и поэтому игнорирует параметр extends
и обрабатывает ваш код как простой автономный настраиваемый элемент.
С другой стороны, Chrome и Firefox будут игнорировать ваше пользовательское определение элемента, поскольку оно неверно.
Если вы хотите, чтобы ваш пользовательский элемент наследовал от <div>
, вы должны сначала расширить класс NoCE
на HTMLDivElement
, а затем использовать синтаксис <div is="no-ce">
. (Но это не сработает в Safari без полизаполнения.)
В качестве альтернативы, если вы хотите создать свой собственный тег HTML с базовым поведением <div>
, вы можете определить автономный пользовательский элемент и применить к нему стиль {display:block}
CSS.
class ACE extends HTMLElement {
connectedCallback() {
this.attachShadow( { mode: 'open' } )
.innerHTML = `<style> :host { display: block } </style>
Autonomous CE works`
}
}
customElements.define( 'a-ce', ACE )
class CBE extends HTMLDivElement {
connectedCallback() {
this.attachShadow( { mode: 'open' } )
.innerHTML = `Customized DIV works`
}
}
customElements.define("c-ce", CBE, { extends: "div" } )
<a-ce>autonomous custom element not implemented</a-ce>
<div is="c-ce">customized built-in element not implemented</div>