Skip to content

Commit 008ac9b

Browse files
correzioni e modifiche
1 parent de2486a commit 008ac9b

File tree

3 files changed

+53
-53
lines changed

3 files changed

+53
-53
lines changed
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11

22
Nota bene:
3-
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.

8-web-components/2-custom-elements/1-live-timer/task.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33

44
Abbiamo già un elemento `<time-formatted>` per mostrare un orario formattato.
55

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à.
88
2. Un tick (aggiornamento) ogni secondo.
99
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>).
1010

8-web-components/2-custom-elements/article.md

Lines changed: 49 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
11

22
# Elementi personalizzati
33

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.
55

66
Una volta definito un elemento personalizzato, possiamo usarlo al pari qualunque altro elemento HTML built-in.
77

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à.
99

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.
1111

1212
Gli elementi personalizzati si dividono in due categorie:
1313

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.
1616

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.
1818

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.
2020

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.
2222

23-
Ecco uno scheletro per la classe, con la lista completa:
23+
Ecco uno schema predefinito per la classe, con la lista completa:
2424

2525
```js
2626
class MyElement extends HTMLElement {
@@ -44,7 +44,7 @@ class MyElement extends HTMLElement {
4444
}
4545

4646
attributeChangedCallback(name, oldValue, newValue) {
47-
// chiamato quadno uno degli attributi della lista precendente viene modificato
47+
// chiamato quando uno degli attributi della lista precedente viene modificato
4848
}
4949

5050
adoptedCallback() {
@@ -73,9 +73,9 @@ Ciò ci assicura l'assenza di conflitti tra i nostri elementi HTML personalizzat
7373
7474
## Esempio: "time-formatted"
7575
76-
Per esempio, esiste già l'elemento `<time>` nell'HTML, per la data/ora. Solo che da sè non compie alcuna formattazione del dato.
76+
Per esempio, esiste già l'elemento `<time>` nell'HTML, per la data/ora. Solo non compie alcuna formattazione del dato di per sé.
7777
78-
Creiamo un elemento `<time-formatted>` che visualizza l'ora in un bel formato che consideri la lingua:
78+
Creiamo invece un elemento `<time-formatted>`, che visualizza l'ora in un formato che consideri la lingua:
7979
8080
8181
```html run height=50 autorun="no-epub"
@@ -115,19 +115,19 @@ customElements.define("time-formatted", TimeFormatted); // (2)
115115
></time-formatted>
116116
```
117117

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 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.
119119
2. Dobbiamo registrare il nostro nuovo elemento tramite `customElements.define(tag, class)`.
120120
3. A questo punto potremo usarlo ovunque.
121121

122122

123123
```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.
125125
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)`.
127127
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`.
129129
130-
Per avere informazioni sugli elementi personalizzati, ci sono due metodi:
130+
Per avere dettagli sugli elementi personalizzati, ci sono due metodi:
131131
- `customElements.get(name)` -- restituisce la classe per un elemento con il dato `name`,
132132
- `customElements.whenDefined(name)` -- restituisce una promise che risolve (senza valore) quando un elemento con il dato nome diventa definito.
133133
```
@@ -137,20 +137,20 @@ Nell'esempio appena visto, il contenuto dell'elemento viene renderizzato (creato
137137

138138
Come mai non nel `constructor`?
139139

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.
141141

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.
143143

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.
145145
```
146146
147147
## Osservare gli attributi
148148
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.
150150
151-
Possiamo osservare gli attributi fornendo la lista dentro il getter statico `observedAttributes()`. Per questi attributi viene 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).
152152
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:
154154
155155
```html run autorun="no-epub" height=50
156156
<script>
@@ -208,26 +208,26 @@ setInterval(() => elem.setAttribute('datetime', new Date()), 1000); // (5)
208208
```
209209

210210
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.
212212
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.
214214
5. Alla fine, possiamo creare un timer live.
215215

216216
## Ordine di rendering
217217

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>`.
219219

220-
Ciò porta ad importanti conseguenze per gli elementi personlizzati.
220+
Ciò porta a conseguenze importanti per gli elementi personalizzati.
221221

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é:
223223

224224
```html run height=40
225225
<script>
226226
customElements.define('user-info', class extends HTMLElement {
227227
228228
connectedCallback() {
229229
*!*
230-
alert(this.innerHTML); // empty (*)
230+
alert(this.innerHTML); // vuoto (*)
231231
*/!*
232232
}
233233
@@ -239,15 +239,15 @@ customElements.define('user-info', class extends HTMLElement {
239239
*/!*
240240
```
241241

242-
Eseguendolo, `alert` risulterebbe vuoto is empty.
242+
Eseguendolo, il contenuto dell'`alert` risulterebbe vuoto.
243243

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.
245245

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.
247247

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.
249249

250-
Così funziona:
250+
Funziona così:
251251

252252
```html run height=40
253253
<script>
@@ -267,11 +267,11 @@ customElements.define('user-info', class extends HTMLElement {
267267
*/!*
268268
```
269269

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.
271271

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.
273273

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.
275275

276276
Vediamolo con un esempio:
277277

@@ -299,34 +299,34 @@ Ordine di output:
299299
3. esterno inzializzato.
300300
4. interno inizializzato.
301301

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)`.
303303

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.
305305

306-
## Customized built-in elements
306+
## Elementi built-in personlizzati
307307

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.
309309

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>`?
311311

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.
313313

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.
315315

316-
1. Estendiamo il `HTMLButtonElement` con la nostra classe:
316+
1. Estendiamo `HTMLButtonElement` con la nostra classe:
317317

318318
```js
319319
class HelloButton extends HTMLButtonElement { /* metodi degli elementi personalizzati */ }
320320
```
321321

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:
323323
```js
324324
customElements.define('hello-button', HelloButton, *!*{extends: 'button'}*/!*);
325325
```
326326

327327
Possono esserci tag differenti che condividono la stessa classe DOM, ecco perché è necessario specificare `extends`.
328328

329-
3. Alla fine, per usare il nostro elemento personalizzato, inseriamo un normale tag `<button>`, aggiungendoc però l'attributo `is="hello-button"`:
329+
3. Alla fine, per usare il nostro elemento personalizzato, inseriamo un normale tag `<button>`, aggiungendoci però l'attributo `is="hello-button"`:
330330
```html
331331
<button is="hello-button">...</button>
332332
```
@@ -359,7 +359,7 @@ customElements.define('hello-button', HelloButton, {extends: 'button'});
359359
*/!*
360360
```
361361

362-
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`.
363363
364364
## Riferimenti
365365
@@ -396,4 +396,4 @@ Gli elementi personalizzati possono essere di due tipi:
396396
/* <button is="my-button"> */
397397
```
398398

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. Quelli che non li supportano possono fare uso di un polyfill <https://github.com/webcomponents/polyfills/tree/master/packages/webcomponentsjs>.

0 commit comments

Comments
 (0)