Un elemento HTML può avere lo stesso attributo due volte?

Sto considerando di scrivere codice che produce un tag HTML che potrebbe avere attributi duplicati, come questo:

È questo HTML legale? Uno dei data-foo -values ​​ha la precedenza sull’altro? Posso contare su browser semi-moderni (IE> = 9) per analizzarli senza soffocare?

O sto per fare qualcosa di veramente stupido qui?

Non è valido avere lo stesso nome attributo due volte in un elemento. I riferimenti autorevoli per questo sono alquanto complicati, poiché le vecchie versioni HTML erano nominalmente basate su SGML e la restrizione è implicita da un riferimento normativo allo standard SGML. In HTML5 PR, la sezione 8.1.2.3 Attributi dice esplicitamente: “Non ci devono mai essere due o più attributi sullo stesso tag di inizio i cui nomi sono una corrispondenza ASCII insensibile alla distinzione tra maiuscole e minuscole.”

Quello che succede in pratica è che l’ultimo attributo è ignorato. Bene, i futuri browser potrebbero fare diversamente. Nel DOM, gli attributi appaiono come proprietà del nodo dell’elemento e nell’object attributes , quindi non ci sarebbe alcun modo naturale di memorizzare due valori.

Non è tecnicamente valido, ma ogni browser ignorerà gli attributi duplicati nei documenti HTML e utilizzerà il primo valore ( data-foo="bar" nel tuo caso).

L’utilizzo dello stesso nome di attributo due volte in un tag viene considerato un errore di analisi interno. Provocherebbe la mancata convalida del tuo documento, se è qualcosa di cui sei preoccupato. Tuttavia, è importante capire che HTML 5 definisce un risultato previsto anche per i casi in cui si ha un “errore di analisi”. Il parser può fermarsi quando incontra un errore, ma se sceglie di non fermarlo deve produrre un risultato specifico descritto nelle specifiche. In pratica, nessun browser sceglie di fermarsi quando incontra errori nei documenti HTML (XML / XHTML è diverso), quindi tutti i browser moderni gestiranno questo caso con successo e in modo coerente.

La specifica HTML WHATWG descrive questo caso nella sezione 12.2.4.33 “Stato del nome attributo” :

Quando lo user agent lascia lo stato del nome dell’attributo (e prima di emettere il token tag, se appropriato), il nome dell’attributo completo deve essere confrontato con gli altri attributi sullo stesso token; se esiste già un attributo sul token con lo stesso nome, allora si tratta di un errore di analisi e il nuovo attributo deve essere eliminato insieme al valore che viene associato (se presente).

Vedi anche la sua descrizione di “errore di analisi” dall’apertura della sezione 12.2 “Analisi di documenti HTML” :

Alcuni punti nell’algoritmo di analisi si dicono errori di analisi. La gestione degli errori per gli errori di analisi è ben definita (sono le regole di elaborazione descritte in questa specifica), ma i programmi utente, mentre analizzano un documento HTML, possono interrompere il parser al primo errore di analisi che incontrano per il quale non desiderano applicare le regole descritte in questa specifica .