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?

Author: Bergi, 2011-05-14

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 atrybutu id: 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 atrybutu type: 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">, to theInput.getAttribute("type") daje Ci "foo", ale theInput.type daje Ci "text".

  • Natomiast właściwość value nie odzwierciedla atrybutu value. 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 gdy value atrybut zawiera initial text-content atrybutu value 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 atrybutu value:

    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.

 596
Author: Šime Vidas,
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.

 31
Author: sibidiba,
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 =)

 8
Author: Daniel Ruf,
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