- From: Joseph Orbegoso Pea <notifications@github.com>
- Date: Sun, 26 Mar 2017 12:57:26 -0700
- To: w3c/webcomponents <webcomponents@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <w3c/webcomponents/issues/509/289310187@github.com>
For example, suppose we target only JS-enabled Custom-Element-API-having browsers. In this case, we should be able to do
```js
customElements.define('enhanced-tr', class EnhancedTR extends HTMLTableRowElement {...})
someTableBody.appendChild(
document.createElement('enhanced-tr')
)
```
```html
...
<tbody>
<enhanced-tr>...</enhanced-tr>
</tbody>
...
```
and it should *just work* without `is-""`, without `{extends: 'tr'}`, and without `document.createElement('enhanced-tr', 'tr')`; without any redundancy. This would be the best developer experience.
*Then later*, we can add a new `is=""` attribute designed specifically for fallbacks if people really want it enough. The previous HTML snippet simple changes to
```html
...
<tbody>
<tr is="enhanced-tr">...</tr>
</tbody>
...
```
but it has *nothing to do with inheritance*, and behaves exactly the same as the `<enhanced-tr>` version when the browser supports Custom Elements, otherwise behaves only like a `<tr>` in non-supporting browsers.
The important thing to re-iterate: `is=""` does not define inheritance. In this new design, we could do this:
```js
customElements.define('awesome-button', class extends HTMLDivElement {...})
```
```html
<awesome-button>
</awesome-button>
```
and we could also do this
```html
<button is="awesome-button">
</button>
```
Note that the Custom Element `awesome-button` does not even extend from `HTMLButtonElement`, it is just an enhanced `div` element that is coded to behave like a button.
In the example with `<button is="awesome-button">`, a browser that supports Custom Elements looks only at the `is=""` attribute (when present) to know what behavior an element has, so the button is an instance of the anonymous class associated with `awesome-button` which extends from `HTMLDivElement`, and the instance does not inherit any behavior of the native `<button>` element whatsoever. It behaves exactly the same as the first example.
The reason for this would be that is="" is strictly for fallbacks: in a browser without JS, or without Custom Elements, the is="" attribute simply does nothing, and the browser instantiates a native `<button>` element.
Basically, in the case that Custom Elements API exists, then
```html
<button is="awesome-button"></button>
```
behaves exactly the same as
```html
<asfasdf is="awesome-button"></asfasdf>
```
both cases create an instance of `<awesome-element>` which is just an enhanced `<div>` element.
This allows developers who are targeting modern browsers to have the best dev experience more similar to React: they are going to have access to JavaScript, and they are going to easily be able to look up the class definition for awesome-button.
Then the rare case for fallbacks (the rare case that someone cares to develop for elinks) can be handled with is="" without the meaning of is="" intertwined with inheritance.
Fallback authors can do
```html
<button is="awesome-button"></button>
```
or they can do
```html
<div is="awesome-button">
</div>
```
Fallback authors can choose what to fall back to, without being coupled to inheritance.
--
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/w3c/webcomponents/issues/509#issuecomment-289310187
Received on Sunday, 26 March 2017 19:57:59 UTC