Myślę, że Tim powiedział to całkiem dobrze , ale cofnijmy się:
Element DOM to obiekt, rzecz w pamięci. Podobnie jak większość obiektów w OOP, ma właściwości . Ma również osobno mapę atrybutów zdefiniowanych na elemencie (zwykle pochodzących ze znaczników czytanych przez przeglądarkę w celu utworzenia elementu). Niektóre właściwości elementu uzyskują swoje wartości początkowe z atrybutów o takich samych lub podobnych nazwach ( value
pobiera swoją wartość początkową z atrybutu „wartość”; href
pobiera swoją wartość początkową z atrybutu „href”, ale nie jest to dokładnie ta sama wartość; className
z atrybut „klasa”). Inne właściwości uzyskują swoje wartości początkowe na inne sposoby: Na przykład parentNode
właściwość uzyskuje swoją wartość na podstawie tego, czym jest jej element nadrzędny;style
właściwość, bez względu na to, czy ma atrybut „styl”, czy nie.
Rozważmy tę kotwicę na stronie http://example.com/testing.html
:
<a href='foo.html' class='test one' name='fooAnchor' id='fooAnchor'>Hi</a>
Niektóre darmowe grafiki ASCII (i pomijając wiele rzeczy):
+ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− +
| HTMLAnchorElement |
+ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− +
| href: „http://example.com/foo.html” |
| nazwa: „fooAnchor” |
| id: "fooAnchor" |
| className: "test one" |
| atrybuty: |
| href: "foo.html" |
| nazwa: „fooAnchor” |
| id: "fooAnchor" |
| klasa: „test jeden” |
+ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− +
Pamiętaj, że właściwości i atrybuty są różne.
Teraz, mimo że są różne, ponieważ wszystko to ewoluowało, a nie było projektowane od podstaw, szereg właściwości odpisuje na atrybut, z którego pochodzą, jeśli je ustawisz. Ale nie wszyscy tak robią, a jak widać z href
góry, mapowanie nie zawsze jest prostym „przekazaniem wartości”, czasem wiąże się to z interpretacją.
Kiedy mówię o właściwościach będących właściwościami obiektu, nie mówię abstrakcyjnie. Oto kod inny niż jQuery:
var link = document.getElementById('fooAnchor');
alert(link.href); // alerts "http://example.com/foo.html"
alert(link.getAttribute("href")); // alerts "foo.html"
(Wartości te są zgodne z większością przeglądarek; istnieje pewna odmiana).
link
Obiekt jest prawdziwa, można zobaczyć tam jest prawdziwa różnica pomiędzy dostępu do własności na niego i uzyskiwania dostępu do atrybutu .
Jak powiedział Tim, przez większość czasu chcemy pracować z nieruchomościami. Częściowo dzieje się tak, ponieważ ich wartości (nawet nazwy) są bardziej spójne w różnych przeglądarkach. Przeważnie chcemy pracować z atrybutami tylko wtedy, gdy nie ma z nim powiązanej właściwości (atrybuty niestandardowe) lub gdy wiemy, że dla tego konkretnego atrybutu atrybut i właściwość nie mają wartości 1: 1 (jak w przypadku href
„href” powyżej) .
Standardowe właściwości są określone w różnych specyfikacjach DOM:
Te specyfikacje mają doskonałe indeksy i zalecamy trzymanie linków do nich pod ręką; Używam ich cały czas.
Niestandardowe atrybuty obejmowałyby na przykład wszelkie data-xyz
atrybuty, które można umieścić na elementach w celu dostarczenia meta-danych do kodu (teraz jest to ważne od HTML5, o ile trzymasz się data-
prefiksu). (Najnowsze wersje jQuery dają ci dostęp do data-xyz
elementów za pośrednictwem data
funkcji, ale ta funkcja nie jest tylko akcesorium do data-xyz
atrybutów [robi to mniej więcej]; chyba że faktycznie potrzebujesz jej funkcji, użyłbym tej attr
funkcji do interakcji z data-xyz
atrybutem).
attr
Funkcja używana mieć jakieś zawiłe logiki wokół uzyskanie co myśleli chciałeś, zamiast dosłownie coraz atrybut. To połączyło koncepcje. Przeprowadzka do prop
i attr
miała na celu ich dezintegrację. Krótko v1.6.0 jQuery poszedł zbyt daleko w tym względzie, ale funkcjonalność dodano szybko z powrotem do attr
obsłużyć typowe sytuacje, w których ludzie używają attr
, gdy technicznie powinni używać prop
.