Jaka jest różnica między właściwościami i atrybutami W HTML?
Po zmianach wprowadzonych w jQuery 1.6.1, próbowałem zdefiniować różnicę między właściwościami i atrybutami W HTML.
Patrząc na listę jQuery 1.6.1 release notes (na dole), wydaje się, że można klasyfikować właściwości i atrybuty HTML w następujący sposób:
Właściwości: Wszystkie, które mają wartość logiczną lub są obliczane UA, np. selectedIndex.
Atrybuty: 'atrybuty', które można dodać do HTML element, który nie jest ani logiczny, ani nie zawiera wartości generowanej przez UA.
Myśli?
3 answers
Pisząc kod źródłowy HTML, możesz zdefiniować atrybuty na swoich elementach HTML. Następnie, gdy przeglądarka przetworzy Twój kod, zostanie utworzony odpowiedni węzeł DOM. Węzeł ten jest obiektem i dlatego ma właściwości .
Na przykład Ten element HTML:
<input type="text" value="Name:">
Posiada 2 atrybuty (type
i value
).
Gdy przeglądarka przetworzy ten kod, zostanie utworzony obiekt HTMLInputElement , który będzie zawierał dziesiątki właściwości takie jak: accept, accessKey, align, alt, attributes, autofocus, baseURI, checked, childElementCount, childNodes, children, classList, className, clientHeight, itp.
Dla danego obiektu węzła DOM, właściwości są właściwościami tego obiektu, a atrybuty są elementami właściwości attributes
tego obiektu.
Gdy węzeł DOM jest tworzony dla danego elementu HTML, wiele jego właściwości odnosi się do atrybutów o takich samych lub podobnych nazwach, ale nie jest to jeden do jednego związek. Na przykład dla tego elementu HTML:
<input id="the-input" type="text" value="Name:">
Odpowiedni węzeł DOM będzie miał id
,type
, i value
właściwości (m.in.):
Właściwość
id
jest właściwością odzwierciedloną dla atrybutuid
: uzyskanie właściwości odczytuje wartość atrybutu, a ustawienie właściwości zapisuje wartość atrybutu.id
jest czystą właściwością odbitą, nie modyfikuje ani nie ogranicza wartości.Nieruchomość
type
jest właściwość reflected dla atrybututype
: uzyskanie właściwości odczytuje wartość atrybutu, a ustawienie właściwości zapisuje wartość atrybutu.type
nie jest właściwością czystego odbicia, ponieważ jest ograniczona do znanych wartości (np. poprawnych typów danych wejściowych). Jeśli masz<input type="foo">
, totheInput.getAttribute("type")
daje Ci"foo"
, aletheInput.type
daje Ci"text"
.-
Natomiast właściwość
value
nie odzwierciedla atrybutuvalue
. Zamiast tego jest to aktualna wartość Z wejście. Gdy użytkownik ręcznie zmieni wartość pola wprowadzania, właściwośćvalue
będzie odzwierciedlać tę zmianę. Jeśli więc użytkownik wprowadzi"John"
do pola wprowadzania, to:theInput.value // returns "John"
theInput.getAttribute('value') // returns "Name:"
Właściwość
value
odzwierciedla current text-content wewnątrz pola wprowadzania, podczas gdyvalue
atrybut zawiera initial text-content atrybutuvalue
z kodu źródłowego HTML.Więc jeśli chcesz wiedzieć, co jest obecnie w środku text-box, przeczytaj właściwość. Jeśli jednak chcesz wiedzieć, jaka była początkowa wartość pola tekstowego, przeczytaj atrybut. Możesz też użyć właściwości
defaultValue
, która jest czystym odzwierciedleniem atrybutuvalue
:theInput.value // returns "John" theInput.getAttribute('value') // returns "Name:" theInput.defaultValue // returns "Name:"
Istnieje kilka właściwości, które bezpośrednio odzwierciedlają ich atrybut (rel
, id
), Niektóre są bezpośrednimi odbiciami o nieco odmiennych nazwach (htmlFor
odzwierciedla atrybut for
, className
odzwierciedla atrybut class
), wiele z nich odzwierciedla ich atrybut ale z ograniczeniami/modyfikacjami (src
, href
, disabled
, multiple
), i tak dalej. spec obejmuje różne rodzaje refleksji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-27 23:01:51
Odpowiedzi już wyjaśniają, w jaki sposób atrybuty i właściwości są traktowane inaczej, ale naprawdę chciałbym podkreślić, jak całkowicie insane to jest. Nawet jeśli jest to w pewnym stopniu spec.
To szalone, mieć niektóre atrybuty (np. id, class, foo, bar), Aby zachować tylko jeden rodzaj wartości w DOM, podczas gdy niektóre atrybuty (np. zaznaczone, zaznaczone), Aby zachować dwie wartości; to jest wartość "kiedy został załadowany" i wartość "dynamic state". (Czy DOM nie powinien w pełni reprezentować stanu dokumentu?)
Jest absolutnie niezbędne, aby dwa pola wejściowe , np. tekst i pole wyboru zachowuj się tak samo . Jeśli pole wprowadzania tekstu nie zachowuje oddzielnej wartości "kiedy zostało załadowane" i wartości "bieżąca, dynamiczna", dlaczego to pole wyboru? Jeśli pole wyboru ma dwie wartości dla atrybutu checked , Dlaczego nie ma dwóch dla jego class i id atrybuty? Jeśli spodziewasz się zmiany wartości pola text *input* i oczekujesz, że DOM (tj. "serializowana reprezentacja") zmieni się i odzwierciedli tę zmianę, to dlaczego na ziemi nie spodziewasz się tego samego od pola input typu checkbox w zaznaczonym atrybucie?
Rozróżnienie "jest atrybutem boolowskim" po prostu nie ma dla mnie żadnego sensu, lub przynajmniej nie jest wystarczającym powodem do tego.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-16 20:03:28
Dobrze są one określone przez w3c co jest atrybutem, a co właściwością http://www.w3.org/TR/SVGTiny12/attributeTable.html
Ale obecnie attr i prop nie są tak różne i są prawie takie same
Ale wolą rekwizyty do niektórych rzeczy
Podsumowanie preferowanego użycia
The .metoda prop () powinna być używana dla boolowskich atrybutów/właściwości oraz dla właściwości, które nie istnieją w html (np. window.miejsce). Wszystkie inne atrybuty (te, które można zobaczyć w html) mogą i powinny być nadal manipulowane za pomocą .metoda attr ().
Cóż właściwie nie musisz czegoś zmieniać, jeśli używasz attr lub prop lub obu, oba działają ale widziałem w mojej własnej aplikacji, że prop działa tam, gdzie atrr Nie, więc wziąłem w moim 1.6 app prop =)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-07 17:47:13