Po zmianach wprowadzonych w jQuery 1.6.1 starałem się zdefiniować różnicę między właściwościami a atrybutami w HTML.
Patrząc na listę w informacjach o wersji jQuery 1.6.1 (u dołu), można klasyfikować właściwości i atrybuty HTML w następujący sposób:
Właściwości: Wszystkie, które albo mają wartość logiczną, albo są obliczone na podstawie UA, takie jak selectedIndex.
Atrybuty: „Atrybuty”, które można dodać do elementu HTML, który nie jest wartością logiczną ani nie zawiera wartości wygenerowanej przez UA.
Myśli?
javascript
html
dom
properties
schalkneethling
źródło
źródło
Odpowiedzi:
Podczas pisania kodu źródłowego HTML możesz definiować atrybuty elementów HTML. Następnie, gdy przeglądarka przeanalizuje kod, zostanie utworzony odpowiedni węzeł DOM. Ten węzeł jest obiektem, a zatem ma właściwości .
Na przykład ten element HTML:
ma 2 atrybuty (
type
ivalue
).Gdy przeglądarka przeanalizuje ten kod, zostanie utworzony obiekt HTMLInputElement , który będzie zawierał dziesiątki właściwości, takich jak: accept, accessKey, align, alt, atrybuty, autofocus, baseURI, zaznaczone, childElementCount, childNodes, child, 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
attributes
właściwości tego obiektu.Kiedy 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 relacja jeden do jednego. Na przykład dla tego elementu HTML:
DOM odpowiedni węzeł będzie mieć
id
,type
ivalue
właściwości (między innymi):id
Nieruchomość jest odzwierciedlone nieruchomość dlaid
atrybutu: Pierwsze właściwość odczytuje wartość atrybutu, a ustawienie właściwości zapisuje wartość atrybutu.id
jest czysto odzwierciedloną właściwością, nie modyfikuje ani nie ogranicza wartości.type
Nieruchomość jest odzwierciedlone nieruchomość dlatype
atrybutu: Pierwsze właściwość odczytuje wartość atrybutu, a ustawienie właściwości zapisuje wartość atrybutu.type
nie jest czystą odzwierciedloną właściwością, ponieważ ogranicza się do znanych wartości (np. prawidłowych typów danych wejściowych). Jeśli tak<input type="foo">
, totheInput.getAttribute("type")
daje,"foo"
aletheInput.type
daje"text"
.Natomiast
value
właściwość nie odzwierciedlavalue
atrybutu. Zamiast tego jest to bieżąca wartość wejścia. Gdy użytkownik ręcznie zmieni wartość pola wprowadzania,value
właściwość odzwierciedli tę zmianę. Jeśli więc użytkownik wprowadzi dane"John"
w polu wprowadzania, wówczas:natomiast:
value
Nieruchomość odzwierciedla aktualny tekst-zawartość wewnątrz pola wejściowego, natomiastvalue
atrybut zawiera początkowy tekst-zawartośćvalue
atrybutu z kodu źródłowego HTML.Więc jeśli chcesz wiedzieć, co aktualnie znajduje się w polu tekstowym, przeczytaj właściwość. Jeśli jednak chcesz wiedzieć, jaka była początkowa wartość pola tekstowego, przeczytaj atrybut. Lub możesz użyć
defaultValue
właściwości, która jest czystym odzwierciedleniemvalue
atrybutu:Istnieje kilka właściwości, które bezpośrednio odzwierciedlają ich atrybut (
rel
,id
), niektóre są bezpośrednimi odbicia z nieznacznie różnymi nazwami (htmlFor
odzwierciedlafor
cechę,className
odzwierciedlaclass
atrybut), wielu, które odzwierciedlają ich atrybut ale z ograniczeniami / modyfikacjami (src
,href
,disabled
,multiple
), a więc na. Specyfikacja obejmuje różne rodzaje odbić.źródło
for
->htmlFor
) i podobnie listę właściwości, które pobierają swoją wartość początkową z atrybutu, ale go nie odzwierciedlają (input.value
). Spodziewam się, że będzie to gdzieś w bibliotece takiej jak github.com/Matt-Esch/virtual-dom, ale tak naprawdę nie jest to udokumentowane.Po przeczytaniu odpowiedzi Sime'a Vidasa przeszukałem więcej i znalazłem bardzo proste i łatwe do zrozumienia wyjaśnienie w dokumentach kątowych .
źródło
colspan
atrybut macolSpan
właściwość. ... Więc który atrybut nie ma teraz powiązanej właściwości?Odpowiedzi już wyjaśniają, w jaki sposób atrybuty i właściwości są traktowane w różny sposób, ale naprawdę chciałbym wskazać, jak całkowicie jest to szalone . Nawet jeśli jest to do pewnego stopnia specyfikacja.
Szaleństwem jest mieć niektóre atrybuty (np. Id, klasa, foo, bar ), aby zachować tylko jeden rodzaj wartości w DOM, a niektóre atrybuty (np. Zaznaczone, wybrane ), aby zachować dwie wartości; to znaczy wartość „kiedy został załadowany” i wartość „stanu dynamicznego”. (Czy DOM nie powinien reprezentować stanu dokumentu w pełnym zakresie?)
Jest absolutnie konieczne, aby dwa pola wprowadzania , np. Tekst i pole wyboru, zachowywały się w ten sam sposób . Jeśli pole wprowadzania tekstu nie zachowuje oddzielnej wartości „po załadowaniu” i wartości „bieżącej, dynamicznej”, dlaczego pole wyboru jest zaznaczone? Jeśli pole wyboru ma dwie wartości dla sprawdzonego atrybutu, dlaczego nie ma dwóch dla jego atrybutów klasy i identyfikatora ? Jeśli spodziewasz się zmienić wartość pola tekstowego * input * i oczekujesz, że DOM (tj. „Reprezentacja szeregowa”) zmieni się i odzwierciedli tę zmianę, dlaczego, u licha, nie spodziewałbyś się tego samego z pola wejściowego wpisz pole wyboru na zaznaczonym atrybucie?
Rozróżnienie „to atrybut boolowski” po prostu nie ma dla mnie żadnego sensu lub przynajmniej nie jest wystarczającym powodem.
źródło
checked
Atrybut jest reprezentowany przezdefaultChecked
obiekcie (podobnie do wprowadzania tekstu w pionievalue
cechą jest reprezentowany przezdefaultValue
własności). Druga właściwość,checked
jest wymagana do reprezentowania, czy pole wyboru jest zaznaczone, ponieważ jest to nieodłączna część funkcjonalności pola wyboru: jest interaktywne i może zostać zmienione (i zresetowane do domyślnego, jeśli obecny jest przycisk resetowania formularza) , w sposób, w jaki inny atrybut taki jakid
nie jest. Nie ma to nic wspólnego z faktem, że jest to atrybut logiczny.cóż, 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
no cóż, właściwie nie musisz niczego zmieniać, jeśli używasz attr lub prop albo oba, oba działają, ale widziałem we własnej aplikacji, że prop działał tam, gdzie atrr nie zrobił, więc wziąłem moją aplikację w wersji 1.6 =)
źródło
Różnica właściwości i atrybutów HTML:
Najpierw spójrzmy na definicje tych słów, zanim ocenimy, jaka jest różnica w HTML:
Angielska definicja:
W kontekście HTML:
Kiedy przeglądarka analizuje HTML, tworzy drzewiastą strukturę danych, która w zasadzie jest reprezentacją HTML w pamięci. Struktura danych drzewa zawiera węzły, które są elementami HTML i tekstem. Związane z tym atrybuty i właściwości są następujące:
Ważne jest również, aby zdawać sobie sprawę, że mapowanie tych właściwości nie jest równe 1 do 1. Innymi słowy, nie każdy atrybut, który podajemy w elemencie HTML, będzie miał podobną nazwę DOM.
Ponadto mają różne elementy DOM różne właściwości. Na przykład
<input>
element ma właściwość wartości, która nie jest obecna we<div>
właściwości.Przykład:
Weźmy następujący dokument HTML:
Następnie sprawdzamy
<div>
w konsoli JS:Widzimy następujące właściwości DOM (chrome devtools, nie wszystkie właściwości pokazane):
class
jest zarezerwowanym słowem kluczowym w JS). Ale właściwie 2 właściwościclassList
iclassName
.źródło