Penso che Tim l'abbia detto abbastanza bene , ma facciamo un passo indietro:
Un elemento DOM è un oggetto, una cosa in memoria. Come la maggior parte degli oggetti in OOP, ha proprietà . Inoltre, separatamente, ha una mappa degli attributi definiti sull'elemento (di solito proveniente dal markup letto dal browser per creare l'elemento). Alcune proprietà dell'elemento ottengono i loro valori iniziali da attributi con nomi uguali o simili ( value
ottiene il suo valore iniziale dall'attributo "valore"; href
ottiene il suo valore iniziale dall'attributo "href", ma non è esattamente lo stesso valore; className
dal attributo "class"). Altre proprietà ottengono i loro valori iniziali in altri modi: ad esempio, la parentNode
proprietà ottiene il suo valore in base all'elemento padre;style
proprietà, che abbia o meno un attributo "style".
Consideriamo questa ancora in una pagina all'indirizzo http://example.com/testing.html
:
<a href='foo.html' class='test one' name='fooAnchor' id='fooAnchor'>Hi</a>
Qualche arte ASCII gratuita (e tralasciando molte cose):
+ ------------------------------------------- +
| HTMLAnchorElement |
+ ------------------------------------------- +
| href: "http://example.com/foo.html" |
| nome: "fooAnchor" |
| id: "fooAnchor" |
| className: "test one" |
| attributi: |
| href: "foo.html" |
| nome: "fooAnchor" |
| id: "fooAnchor" |
| classe: "test one" |
+ ------------------------------------------- +
Si noti che le proprietà e gli attributi sono distinti.
Ora, sebbene siano distinti, poiché tutto ciò si è evoluto anziché essere progettato da zero, un certo numero di proprietà riscrive l'attributo da cui derivano se le imposti. Ma non tutti lo fanno, e come puoi vedere href
dall'alto, la mappatura non è sempre un "passaggio del valore", a volte c'è un'interpretazione implicata.
Quando parlo di proprietà come proprietà di un oggetto, non parlo in astratto. Ecco un codice non jQuery:
var link = document.getElementById('fooAnchor');
alert(link.href); // alerts "http://example.com/foo.html"
alert(link.getAttribute("href")); // alerts "foo.html"
(Questi valori sono come per la maggior parte dei browser; c'è qualche variazione.)
L' link
oggetto è una cosa reale e puoi vedere che esiste una vera distinzione tra l'accesso a una proprietà su di esso e l'accesso a un attributo .
Come ha detto Tim, la stragrande maggioranza delle volte, vogliamo lavorare con le proprietà. In parte è perché i loro valori (anche i loro nomi) tendono ad essere più coerenti tra i browser. Vogliamo principalmente lavorare con gli attributi quando non ci sono proprietà correlate ad esso (attributi personalizzati), o quando sappiamo che per quel particolare attributo, l'attributo e la proprietà non sono 1: 1 (come con href
e "href" sopra) .
Le proprietà standard sono esposte nelle varie specifiche DOM:
Queste specifiche hanno indici eccellenti e raccomando di tenere a portata di mano i collegamenti; Li uso sempre.
Gli attributi personalizzati includono, ad esempio, qualsiasi data-xyz
attributo che potresti mettere sugli elementi per fornire metadati al tuo codice (ora che è valido a partire da HTML5, purché ti attieni al data-
prefisso). (Le versioni recenti di jQuery ti danno accesso agli data-xyz
elementi tramite la data
funzione, ma quella funzione non è solo un accessorio per gli data-xyz
attributi [fa sia più che meno di quello]; a meno che tu non abbia effettivamente bisogno delle sue caratteristiche, userei la attr
funzione per interagire con data-xyz
attributo.)
La attr
funzione aveva una logica contorta attorno a ottenere ciò che pensavano volessi, piuttosto che ottenere letteralmente l'attributo. Ha unito i concetti. Il passaggio a prop
ed attr
era destinato a deconfigurarli. Brevemente in v1.6.0 jQuery è andato troppo in proposito, ma la funzionalità è stato subito aggiunto nuovamente per attr
per gestire le situazioni comuni in cui le persone usano attr
quando tecnicamente dovrebbero usare prop
.