2013-01-23 12 views
5

Właśnie natknął się coś takiego ...co to jest atrybut.specyfikowany dla atrybutów elementu DOM?

function(element) { 
    ... 
    var attributes = element.attributes; 
    for (var index = 0, length = attributes.length; index < length; index++) { 
    var attribute = attributes[index]; 

    // what is ".specified"? 
    if (attribute.specified) { 
     ... 
    } 
    } 
} 

Patrzę na specyfikacji W3C dla elementu DOM, interfejs Element, i nie widzę specified wszędzie.

http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-745549614

Co attribute.specified oznacza? Co to reprezentuje? Gdzie jest to zdefiniowane w specyfikacji?

+0

Czy myślisz o tym? http://www.w3schools.com/jsref/prop_attr_specified.asp – LNendza

+0

tak, to właśnie mówię o – Hristo

+1

Nie wiem, gdzie jest to zdefiniowane w specyfikacji, ale uznałem, że ich definicja jest całkiem adekwatna: Podana właściwość zwraca wartość true, jeśli atrybut jest określony. Zwraca wartość true, jeśli atrybut został utworzony, ale nie został jeszcze dołączony do elementu. W przeciwnym razie zwraca wartość false. Sądzę, że to jest sposób na to, że ktoś je odkłada. – LNendza

Odpowiedz

2

<img src="kittens.jpg">. atrybut to src, a jego wartość to kittens.jpg. Elementy DOM to ogólne definicje. rzeczywiste atrybuty są określone przez rzeczywisty używany język, np. XML, HTML itd.

podano = atrybut ma przypisaną jawną wartość. na przykład atrybut src jest określony, bo to nadano wartość kittens.jpg, ale

<input type="checkbox" checked /> 

sprawdzonej atrybut jest obecny, ale nie podano.

+0

Nie "określony" oznacza tylko, że atrybut jest obecny w oryginalnym kodzie HTML lub został ustawiony przez skrypt za pomocą 'setAttribute()'. "checked" w twoim przykładzie ** jest określone **. Przykład: http://jsfiddle.net/timdown/DM8Tr/1/. Spec: http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-637646024 –

+0

hej Tim ... czy myślisz o stworzeniu własnej odpowiedzi z dodatkowymi szczegółami? – Hristo

-1

Różne przeglądarki mają różne implementacje DOM i zauważ, że implementacja jest odpowiedzialna za ten atrybut, a nie za użytkownika. Jednak użytkownik może zmienić domyślną wartość atrybutu.

Co do Chrome 54.0.2840.71 sprawia, że ​​każdy atrybut.specified true, albo jest w specyfikacji DOM, albo nie, albo ma wartość, albo nie. dla przykładu, określony atrybut __test jest zawsze prawdziwy w Chrome (wersja 54).

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Document</title> 
</head> 
<body> 
    <div __test></div> 
    <script> 
     var div=document.querySelector("div"); 
     var attributes = div.attributes; 
     var attr_test=attributes[0]; 
     attr_test.specified=false;// "specified" is not writable and Setting it silently fails. 
     console.log(attr_test.specified); 
    </script> 
</body> 
</html> 

tak zgadzam się, że „to jest na jego drodze do bycia depracted”.

"atrybut.specified" różni się w DOM poziom 3 od DOM level2 spec.

punkt 1.same

Prawda jeśli atrybut ten został wyraźnie podana wartość w dokumencie instancji, false w przeciwnym wypadku. Jeśli aplikacja zmieniła wartość tego węzła atrybutu (nawet jeśli kończy się on na tej samej wartości, co wartość domyślna), wówczas jest ustawiona na wartość true.

2.Differences
"DOM-Level2" ma bardziej skomplikowany stan wyroku do decydowania, czy "attribute.specified" jest prawdziwe, czy nie.
„DOM-Poziom 3” mówi

Implementacja może obsługiwać atrybuty o wartościach domyślnych z innych schematów podobnie ale aplikacje powinny używać Document.normalizeDocument() w celu zagwarantowania tych informacji jest up-to-date.

wyszukiwania specified of type boolean, readonly w
https://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-637646024
vs
https://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-862529273

0

Właśnie znaleźć informację, że atrybut węzła nieruchomość specified ma sens tylko dla IE 6-7, bo w IE 6-7 attributes zwraca kolekcję wszystkie atrybuty obsługiwane przez dany element węzła. Następnie możesz użyć specified, aby sprawdzić, czy atrybut z kolekcji jest dołączony do węzła elementu. Zwróci false, jeśli węzeł elementu nie ma określonego/zdefiniowanego atrybutu. W nowoczesnych przeglądarkach attributes zwraca kolekcję atrybutów dołączonych do elementu w rzeczywistości oznacza to, że każdy attribute.specified z kolekcji zwróci true we współczesnych przeglądarkach. W nowoczesnych przeglądarkach element.hasAttribute(attribute) działa tak, że element.attributes[attribute].specified działa dla IE 6-7.