2015-03-04 4 views
1

Я хотел бы установить атрибут span узла visited на true или false на основании, если он был посещен.set/getAttribute сравнения работают только со строками?

test(); 

function test() { 

    var el = document.createElement("span"); 
    el.setAttribute("visited", false); 

    el.setAttribute("visited", true); 

    alert(el.getAttribute("visited") === true); //False 
    alert(el.getAttribute("visited") === "true"); //True 

} 

Я изначально установить атрибут «посетил» для булева ложных, затем установить логическое значение для истинного. Я заметил, что когда я проверил, был ли атрибут true, он вернул значение false, но если я проверил строку true, она вернулась.

MSN Docs говорить только об атрибутеName как обязательном для строки, а не в значении. Так почему же не сравнивается с bools?

FIDDLE

+7

Да, атрибуты всегда являются строками, но 'свойствами' может быть несколько разных типов. –

+0

MSDN не является нормативной ссылкой для соответствующего стандарта, W3C: [* setAttribute *] (http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-F68F082), [* getAttribute *] (http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-666EE0F9). – RobG

ответ

4

Это происходит потому, что getAttribute возвращаемого типа строка не BOOL

Возвращаемого значения: A String, представляющее значение указанного атрибута.

Примечание: Если атрибут не существует, возвращаемое значение равно нулю или пустая строка («»)

0

В === оператор проверяет, как значение и тип (без неявного принуждения типов).

Поскольку getAttribute возвращает значение строки, сравнение только true по сравнению со строкой «истина», а не тогда, когда по сравнению с булевым значением true.

Иными словами, при использовании оператора === ...

true === 'true' // false 
'true' === 'true' // true 
true === true // true 
+0

, пожалуйста, попробуйте его в консоли перед downvoting ... – sfletche

-1

Вот определение атрибутов, как это определено в HTML-стандарт:

3.2.3.1 Attributes

За исключением если указано иначе, атрибуты на HTML elements могут иметь любое строковое значение, включая пустую строку. За исключением случаев, когда явно указано , нет никаких ограничений на то, какой текст может быть указан в таких атрибутах .

Итак, чтобы повторить то, что уже было указано, атрибуты HTML всегда являются строками.

+1

«может иметь» не то же самое, что «должно быть» - ваша интерпретация «are alwasys strings» неверна. Кроме того, как вы цитируете, есть некоторые исключения. – ochi

+0

Я интерпретирую его таким образом, что «может иметь» относится к «любому», а не к типу, как это объясняется во втором предложении. –

+1

@FelixKling Да, но ochi означает, что * «может иметь любое строковое значение» * не означает, что «имеет только строковые значения» *. Вышеупомянутый текст говорит, что он может иметь любое строковое значение, он не говорит, что атрибуты должны быть строками. –