You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
1.Facciamo il clear di `setInterval`del timer quando rimuoviamo l'elemento dal documento. È importante, altrimenti continuerà a ticchettare anche se non più necessario. Ed il browser non sarà in grado di pulire la sua memoria dall'elemento se ha ancora un riferimento.
4
-
2. Deve essere possibile accedere alla data corrente tramite la proprietà `elem.date`. Tutti i metodi della classe e le relative proprietà sono anche metodi e proprietà dell'elemento.
3
+
1.Quando rimuoviamo l'elemento dal documento, eseguiamo il clear di `setInterval`per il timer. È importante, altrimenti continuerà a ticchettare anche se non più necessario. Inoltre il browser avendo ancora un riferimento ad esso, non sarà in grado di pulire la sua memoria.
4
+
2. Deve essere possibile accedere alla data corrente tramite la proprietà `elem.date`. Tutti i metodi della classe e le relative proprietà devono anche essere metodi e proprietà dell'elemento.
Copy file name to clipboardExpand all lines: 8-web-components/2-custom-elements/1-live-timer/task.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -3,8 +3,8 @@
3
3
4
4
Abbiamo già un elemento `<time-formatted>` per mostrare un orario formattato.
5
5
6
-
Create un elemento `<live-timer>` per mostrare l'orario corrente:
7
-
1. Internamente dovrebbe usare `<time-formatted>`, senza duplicare la sua funzionalità.
6
+
Create un elemento `<live-timer>` per mostrare l'orario corrente con queste specifiche:
7
+
1. Internamente dovrebbe usare `<time-formatted>`, senza duplicarne la funzionalità.
8
8
2. Un tick (aggiornamento) ogni secondo.
9
9
3. Per ogni tick, deve essere generato un evento personalizzato chiamato `tick`, con la data corrente dentro `event.detail` (guardare il capitolo <info:dispatch-events>).
Copy file name to clipboardExpand all lines: 8-web-components/2-custom-elements/article.md
+49-49Lines changed: 49 additions & 49 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,26 +1,26 @@
1
1
2
2
# Elementi personalizzati
3
3
4
-
Possiamo creare elementi HTML personalizzati, descritti tramite delle apposite classi, con metodi propri metodi, proprietà, eventi e così via.
4
+
Possiamo creare elementi HTML personalizzati, dichiarati e descritti tramite delle apposite classi, ognuno con i suoi metodi, proprietà, eventi e così via.
5
5
6
6
Una volta definito un elemento personalizzato, possiamo usarlo al pari qualunque altro elemento HTML built-in.
7
7
8
-
Ciò è grandioso, dato che il dizionario HTML è molto ricco, ma non infinito. Non ci sono `<easy-tabs>`, `<sliding-carousel>`, `<beautiful-upload>`... Basti pensare a qualunque altro tag di cui abbiamo necessità.
8
+
Ciò è grandioso, essendo che il dizionario HTML è molto ricco, ma non infinito. Non ci sono `<easy-tabs>`, `<sliding-carousel>`, `<beautiful-upload>`...Ci basti pensare a qualunque altro tag di cui avremmo necessità.
9
9
10
-
Possiamo definirli con classi speciali, ed usarli come se fossero sempre stati parte dell'HTML.
10
+
Possiamo definirli con delle classi speciali, ed usarli come se fossero sempre stati parte dell'HTML.
11
11
12
12
Gli elementi personalizzati si dividono in due categorie:
13
13
14
-
1.**Custom elements autonomi** -- elementi "nuovi di zecca", che estendono la casse astratta `HTMLElement`.
15
-
2.**Customized built-in elements** -- che estendono gli elementi built-in, ad esempio un pulsante personalizzato, basato su `HTMLButtonElement` etc.
14
+
1.**Elementi personalizzati autonomi** -- elementi "nuovi di zecca", che estendono la casse astratta `HTMLElement`.
15
+
2.**Elementi built-in personalizzati** -- estendono gli elementi built-in, ad esempio un pulsante personalizzato, basato su `HTMLButtonElement` etc.
16
16
17
-
Per primo, affrontiamo gli elementi autonomi, dopodiché ci sposteremo su quelli built-in personalizzati.
17
+
Prima di tutto, affrontiamo gli elementi autonomi, dopodiché ci spostiamo su quelli built-in personalizzati.
18
18
19
-
Per creare un elemento personalizzato, abbiamo bisogno di comunicare al browser una serie di dettagli su di esso: come mostrarlo, cosa fare una volta che l'elemento venga aggiunto o rimosso dalla pagina, etc.
19
+
Per creare un elemento personalizzato, abbiamo bisogno di comunicare al browser una serie di dettagli relativi: come mostrarlo, cosa fare una volta che l'elemento venga aggiunto o rimosso dalla pagina, etc.
20
20
21
-
Ciò viene fatto creando una classe con metodi speciali. È facile, dato che ci sono pochi metodi e sono tutti opzionali.
21
+
Ciò viene fatto creando una classe con dei metodi appositi. È facile, dato che ci sono pochi metodi, tutti opzionali.
22
22
23
-
Ecco uno scheletro per la classe, con la lista completa:
23
+
Ecco uno schema predefinito per la classe, con la lista completa:
24
24
25
25
```js
26
26
classMyElementextendsHTMLElement {
@@ -44,7 +44,7 @@ class MyElement extends HTMLElement {
1. La classe contiene solo il metodo `connectedCallback()`, che il browser chiama appena l'elemento `<time-formatted>` viene aggiunto alla pagina (o quando il parser HTML lo riconosce). Il metodo usa il formattatore built-in delle date built-in[Intl.DateTimeFormat](mdn:/JavaScript/Reference/Global_Objects/DateTimeFormat), ben supportato dai browser, per mostrare l'ora ben formattata.
118
+
1. La classe contiene solo il metodo `connectedCallback()` che il browser chiama appena l'elemento `<time-formatted>` viene aggiunto alla pagina (o quando il parser HTML lo riconosce). Il metodo usa il formattatore built-in delle date [Intl.DateTimeFormat](mdn:/JavaScript/Reference/Global_Objects/DateTimeFormat), ben supportato dai browser, per mostrare l'ora formattata.
119
119
2. Dobbiamo registrare il nostro nuovo elemento tramite `customElements.define(tag, class)`.
120
120
3. A questo punto potremo usarlo ovunque.
121
121
122
122
123
123
```smart header="Aggiornamento degli elementi personalizzati"
124
-
Se il browser incontrasse un elemento `<time-formatted>` prima di `customElements.define`, non andrebbe in errore. Ma tratterebbe l'elemento come sconosciuto, come tratterebbe un tag non standard.
124
+
Se il browser incontrasse un elemento `<time-formatted>` prima di `customElements.define`, non andrebbe in errore. Ma tratterebbe l'elemento come sconosciuto, proprio come farebbe con un tag non standard.
125
125
126
-
Così questi elementi "undefined" possono essere stilizzati con il selettore CSS `:not(:defined)`.
126
+
In questo modo, questi elementi "undefined" possono comunque essere stilizzati con il selettore CSS `:not(:defined)`.
127
127
128
-
Quando viene chiamato `customElement.define`, vengono "aggiornati": viene creata una nuova istanza di `TimeFormatted` per ognuno di essi, e chiamato il metodo `connectedCallback`. Quindi diventeranno `:defined`.
128
+
Quando poi viene chiamato `customElement.define`, gli elementi vengono "aggiornati": viene creata una nuova istanza di `TimeFormatted` per ognuno di essi, e chiamato il metodo `connectedCallback`. Infine diventeranno `:defined`.
129
129
130
-
Per avere informazioni sugli elementi personalizzati, ci sono due metodi:
130
+
Per avere dettagli sugli elementi personalizzati, ci sono due metodi:
131
131
- `customElements.get(name)` -- restituisce la classe per un elemento con il dato `name`,
132
132
- `customElements.whenDefined(name)` -- restituisce una promise che risolve (senza valore) quando un elemento con il dato nome diventa definito.
133
133
```
@@ -137,20 +137,20 @@ Nell'esempio appena visto, il contenuto dell'elemento viene renderizzato (creato
137
137
138
138
Come mai non nel `constructor`?
139
139
140
-
Il motivo è semplice: quando viene chamato`constructor`, è ancora troppo presto. L'elemento è stato creato, mail browser non ha ancora processato/assegnato gli attributi in questa fase: una chiamata a `getAttribute` restituirebbe `null`. Quindi non possiamo renderizzare proprio nulla in quel punto.
140
+
Il motivo è semplice: quando viene chiamato`constructor`, è ancora troppo presto. L'elemento è stato creato, ma in questa fase, il browser non ha ancora processato/assegnato gli i vari attributi: in questo frangente, una chiamata a `getAttribute` restituirebbe `null`. Di conseguenza, non possiamo renderizzare proprio nulla in quel punto.
141
141
142
-
Oltretutto, pensandoci attentamente, è saggio in termini di prestazioni, ritardare il lavoro fino al momento in cui serve davvero.
142
+
Oltretutto, pensandoci attentamente, in termini di prestazioni, è una cosa saggia ritardare il lavoro fino al momento in cui non serva davvero.
143
143
144
-
Il metodo `connectedCallback` viene chiamato in seguito all'aggiunta dell'elemento nel documento. Non quando viene inserito dentro un altro elemento figlio, ma quando entra a far parte della pagina. Quindi possiamo costruire un DOM separato, creare elementi e prepararli per usi successivi. Verranno renerizzati davvero quando saranno parte della pagina.
144
+
Il metodo `connectedCallback` viene chiamato in seguito all'aggiunta dell'elemento nel documento. Non quando viene inserito dentro un altro elemento, ma quando entra a far parte della pagina. Quindi possiamo costruire un DOM separato, creare elementi e prepararli per usi successivi. Verranno renderizzati davvero, solo quando saranno parte della pagina.
145
145
```
146
146
147
147
## Osservare gli attributi
148
148
149
-
Nell'implementazione attuale di `<time-formatted>`, dopo che l'elemento viene rederizzato, cambi di attributi successivi non sortiscono alcun effetto. Questo è curioso che avvenga per un elemento HTML. Solitamente, quando cambiamo un attributo come ad esempio `a.href`, ci aspettiamo di vedere subito la modifica. Correggiamo il comportamento.
149
+
Nell'implementazione attuale di `<time-formatted>`, dopo che l'elemento viene renderizzato, i successivi cambi di attributi non sortiranno alcun effetto. È curioso che ciò avvenga per un elemento HTML. Solitamente, quando cambiamo un attributo come ad esempio `a.href`, ci aspettiamo di vederne immediatamente la modifica. Andiamo a gestire questo comportamento.
150
150
151
-
Possiamo osservare gli attributi fornendo la lista dentro il getter statico `observedAttributes()`. Per questi attributiviene chiamato `attributeChangedCallback` per ogni loro modifica. Non viene chiamato per gli altri attributi fuori dalla lista (questo per ragioni di prestazioni).
151
+
Possiamo osservare gli attributi fornendone una lista dentro il getter statico `observedAttributes()`. Per questi attributi, ad ogni loro modifica, viene chiamato `attributeChangedCallback`. Non viene chiamato per gli altri attributi fuori dalla lista (per ragioni di prestazioni).
152
152
153
-
Ecco un nuovo `<time-formatted>`, che aggiorna in automatico al cambio di attributo:
153
+
Ecco un nuovo `<time-formatted>`, che si aggiorna in automatico al cambio di attributo:
1. La logica di rendering viene spostata sul metodo helper `render()`.
211
-
2. Possiamo chiamarlo una sola volta quando l'lemento viene inserito in pagina.
211
+
2. Possiamo chiamarlo una sola volta quando l'elemento viene inserito in pagina.
212
212
3. Al cambio di un attributo, dentro la lista `observedAttributes()`, viene chiamato `attributeChangedCallback`.
213
-
4. ...e viene rirenderizzato l'elemento.
213
+
4. ...e l'elemento viene renderizzato nuovamente.
214
214
5. Alla fine, possiamo creare un timer live.
215
215
216
216
## Ordine di rendering
217
217
218
-
Quando il parser HTML costruisce il DOM, gli elementi vengono processati uno dopo l'altro, i genitori prima dei figli. Ad esempio, aveno una siffatta struttura `<outer><inner></inner></outer>`, l'elemento `<outer>` verrebbe creato e connesso per primo al DOM. dopodichè passerebbe a`<inner>`.
218
+
Quando il parser HTML costruisce il DOM, gli elementi vengono processati uno dopo l'altro, i genitori prima dei figli. Ad esempio, avendo una struttura del tipo `<outer><inner></inner></outer>`, l'elemento `<outer>` verrebbe creato e connesso per primo al DOM. Dopodiché passerebbe all'elemento`<inner>`.
219
219
220
-
Ciò porta ad importanti conseguenze per gli elementi personlizzati.
220
+
Ciò porta a conseguenze importanti per gli elementi personalizzati.
221
221
222
-
Per esempio, se un elemento custom provasse ad accedere all'`innerHTML` al `connectedCallback`, non otterbbe alcunché:
222
+
Per esempio, se un elemento custom provasse ad accedere all'`innerHTML` al `connectedCallback`, non otterrebbe alcunché:
@@ -239,15 +239,15 @@ customElements.define('user-info', class extends HTMLElement {
239
239
*/!*
240
240
```
241
241
242
-
Eseguendolo, `alert` risulterebbe vuoto is empty.
242
+
Eseguendolo, il contenuto dell'`alert` risulterebbe vuoto.
243
243
244
-
Questo è proprio perché non ci sono figli in questa fase ed il DOM è incompleto. Il parser ha collegato l'elemento custom`<user-info>`, e sta procedendo verso i suoi figli, ma nient'altro.
244
+
Questo è proprio perché in questa fase non ci sono figli, ed il DOM è ancora incompleto. Il parser ha collegato l'elemento custom `<user-info>`, e sta procedendo verso i suoi figli, ma nient'altro.
245
245
246
-
Se volessimo inviare delle informazioni all'elemnto, potremmo usare gli attributi, che sono subito disponibili.
246
+
Se volessimo inviare delle informazioni all'elemento, potremmo usare gli attributi, che sono subito disponibili.
247
247
248
-
Oppure, se davvero abbiamo necessità di avere a che fare con i figli, possiamo ritardarne al''accesso, con un `setTimeout` a ritardo zero.
248
+
Oppure, se davvero abbiamo necessità di avere a che fare con i figli, possiamo ritardarne impostare un `setTimeout` a latenza zero.
249
249
250
-
Così funziona:
250
+
Funziona così:
251
251
252
252
```html run height=40
253
253
<script>
@@ -267,11 +267,11 @@ customElements.define('user-info', class extends HTMLElement {
267
267
*/!*
268
268
```
269
269
270
-
Ora l'alert `alert` alla riga `(*)` mostrerà "John", come se lo eseguissimo in modo asincrono, a parsing HTML completato. Possiamo processare i figli se necesssario e terminare l'iniziolizzazione.
270
+
Adesso l'`alert` alla riga `(*)` mostrerà "John", come se lo eseguissimo in modo asincrono, a parsing HTML completato. Possiamo processare i figli se necessario e terminare l'inizializzazione.
271
271
272
-
D'altra parte la soluzione non è perfetta, perchè se anche i figli utilizzassero `setTimeout` per inzializzare sè stessi a loro volta, si metterebbero in coda: a quel punto prima verrebbe eseguito il `setTimeout` esterno, e poi quello interno.
272
+
D'altra parte, la soluzione non è perfetta, perchè se anche i figli utilizzassero `setTimeout` per inizializzare sé stessi a loro volta, si metterebbero in coda: a quel punto prima verrebbe eseguito il `setTimeout` esterno, e poi quello interno.
273
273
274
-
E così l'elemento esterno terminerebbe prima di quello interno.
274
+
E così non avremmo risolto granché, dato che di nuovo l'elemento esterno terminerebbe prima di quello interno.
275
275
276
276
Vediamolo con un esempio:
277
277
@@ -299,34 +299,34 @@ Ordine di output:
299
299
3. esterno inzializzato.
300
300
4. interno inizializzato.
301
301
302
-
Possiamo chiaramente verificar che l'elemento esterno conclude la sua inizializzazione `(3)` prima di quello interno `(4)`.
302
+
Possiamo chiaramente verificare che l'elemento esterno conclude la sua inizializzazione `(3)` prima di quello interno `(4)`.
303
303
304
-
Non c'è una una callback che si attiva dopo che gli elmenti annidati sono pronti. Se necessario, possiamo implementare queste genere di cose da noi. per esempio, gli elementi interni possono eseguire eventi come `initialized`, e quelli esterni possono mettersi in ascolto e reagire di conseguenza.
304
+
Non c'è una una callback che si attiva dopo che gli elementi annidati sono pronti. Se necessario, possiamo implementare queste genere di cose da noi. Per esempio, gli elementi interni possono eseguire eventi come `initialized`, e quelli esterni possono mettersi in ascolto per reagire di conseguenza.
305
305
306
-
## Customized built-in elements
306
+
## Elementi built-in personlizzati
307
307
308
-
I nuovi elementi che creiamo, come `<time-formatted>`, non hanno nessuna semantica associata. Sono del tutto sconosciuti a motori di ricerca, e i dispositivi di accessiblitànon possono gestirli.
308
+
I nuovi elementi che creiamo, come `<time-formatted>`, non hanno una semantica associata. Sono del tutto sconosciuti per motori di ricerca, e dispositivi di accessiblità, che non possono quindi gestirli.
309
309
310
-
Ma anche queste cose possono essere rilevanti. Ad esempio al motore di ricerca potrebbe importare di conoscere che mostriamo l'orario. E ese stiamo un particolare tipo di pulsante, perché non riutilizzare la funzionalità esistente di `<button>`?
310
+
Queste cose possono avere la loro rilevanza. Ad esempio al motore di ricerca potrebbe interessare sapere che un componente mostra l'orario. E se stiamo creando un particolare tipo di pulsante, perché non riutilizzare la funzionalità esistente di `<button>`?
311
311
312
-
Possiamo estedere e personalizzare gli elementi HTML built-in ereditando dalle lor classi.
312
+
Possiamo estedere e personalizzare gli elementi HTML built-in ereditando dalle loro classi.
313
313
314
-
Per esempio, i pulsanti sono una istanza di `HTMLButtonElement`, lo quello andiamo a costruirci sopra.
314
+
Per esempio, i pulsanti sono una istanza di `HTMLButtonElement`, e possiamo partire da quello per andarci a costruire sopra.
315
315
316
-
1. Estendiamo il `HTMLButtonElement` con la nostra classe:
316
+
1. Estendiamo `HTMLButtonElement` con la nostra classe:
317
317
318
318
```js
319
319
classHelloButtonextendsHTMLButtonElement { /* metodi degli elementi personalizzati */ }
320
320
```
321
321
322
-
2.Fornisceil terzo argomenti a `customElements.define`, che specifia il tag:
322
+
2.Forniamo il terzo argomenti a `customElements.define`, che specifica il tag:
Il nostro nuovo pulsante estende quello built-in. Quindi mantiene gli stessi stili e caratteristiche standard come l'attributo `disabled`.
362
+
Il nostro nuovo pulsante estende quello built-in. Ne mantiene gli stili e le caratteristiche standard come ad esempio, l'attributo `disabled`.
363
363
364
364
## Riferimenti
365
365
@@ -396,4 +396,4 @@ Gli elementi personalizzati possono essere di due tipi:
396
396
/* <button is="my-button"> */
397
397
```
398
398
399
-
Gli elementi sono ben supportati nei vari browser. Per i browser che non la supportano esistono un polyfill <https://github.com/webcomponents/polyfills/tree/master/packages/webcomponentsjs>.
399
+
Gli elementi personalizzati sono ben supportati nei vari browser. Quelliche non li supportano possono fare uso di un polyfill <https://github.com/webcomponents/polyfills/tree/master/packages/webcomponentsjs>.
0 commit comments