сравнения set/getAttribute работают только со строками?

Я хотел бы установить для атрибута visited узла span значение true или false в зависимости от того, был ли он посещен.

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

}

Сначала я установил для атрибута "visited" логическое значение false, а затем установил логическое значение true. Я заметил, что когда я проверял, был ли атрибут равен true, он возвращал false, но если я проверял строку true, он возвращал true.

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

СКРИПКА


person Growler    schedule 04.03.2015    source источник
comment
Да, attributes всегда строки, но properties может быть нескольких разных типов.   -  person KJ Price    schedule 04.03.2015
comment
MSDN не является нормативным справочником для соответствующего стандарта, W3C: setAttribute, getAttribute.   -  person RobG    schedule 04.03.2015


Ответы (3)


Это связано с тем, что возвращаемый тип getAttribute является строкой, а не логическим значением.

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

Примечание. Если атрибут не существует, возвращаемое значение равно null или пустой строке ("").

person Tushar    schedule 04.03.2015

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

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

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

true === 'true' // false
'true' === 'true' // true
true === true // true
person sfletche    schedule 04.03.2015

Вот определение атрибутов согласно стандарту HTML:

3.2.3.1 Атрибуты

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

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

person Felix Kling    schedule 04.03.2015
comment
«может иметь» не то же самое, что «должен иметь» - ваша интерпретация «всегда строки» неверна. Кроме того, как вы цитируете, есть некоторые исключения. - person blurfus; 04.03.2015
comment
Я интерпретирую его таким образом, что он может иметь отношение к любому, а не к типу, как далее поясняется во втором предложении. - person Felix Kling; 04.03.2015
comment
@FelixKling Да, но очи означает, что может иметь любое строковое значение, не означает, что имеет только строковые значения. В приведенном выше тексте говорится, что он может иметь любое строковое значение, но не говорится, что атрибуты должны быть строками. - person Spencer Wieczorek; 04.03.2015
comment
@Spencer: Конечно, но если это не подразумевается, почему строковые значения вызываются явно? Почему нет упоминания о числовых значениях или значениях списка и т. д.? - person Felix Kling; 04.03.2015
comment
@FelixKling есть такие вещи, как логические атрибуты. Сказать, что может быть любая строка, не означает, что должны быть только строки. Вместо этого это означает, что допустимо строковое значение среди других возможных значений (например, логическое) - person blurfus; 04.03.2015
comment
@ochi: значением логического атрибута является пустая строка или строка, содержащая имя атрибута: Некоторые атрибуты являются логическими атрибутами. Наличие логического атрибута у элемента представляет истинное значение, а отсутствие атрибута представляет ложное значение. Если атрибут присутствует, его значение должно быть либо пустой строкой, либо значением, которое соответствует каноническому имени атрибута без учета регистра ASCII без начальных и конечных пробелов. html.spec.whatwg.org/multipage/ - person Felix Kling; 04.03.2015
comment
@ochi — см. спецификацию DOM 3 для < i>setAttribute: Это значение представляет собой простую строку; он не анализируется, так как устанавливается. - person RobG; 04.03.2015
comment
@ochi: И опять же, это единственная часть спецификации HTML, посвященная общей структуре атрибутов. Зачем явно указывать строковые значения, если есть и другие возможные значения? Почему запись не может иметь любое числовое значение? - person Felix Kling; 04.03.2015
comment
В смысле, я не отрицаю, что могу ошибаться. Но я не нахожу аргументы, выдвинутые против моей интерпретации, очень убедительными. Одним из аргументов против моей интерпретации может быть спецификация HTML4, в которой не упоминаются типы: w3.org/TR/html4/intro/sgmltut.html#h-3.2.2 - person Felix Kling; 04.03.2015
comment
Ну, опять же, я только говорю, что a) Есть исключения (как указано в спецификации и вы) b) может иметь любую строку != строки всегда. - person blurfus; 04.03.2015
comment
@FelixKling Я считаю, что это подразумевается, просто об этом прямо не говорится. Кроме того, @ochi утверждение Если не указано иное, может означать, что атрибут не может иметь никакого строкового значения, а не то, что это не строка. - person Spencer Wieczorek; 04.03.2015
comment
@Spencer: Вот как я это интерпретирую. Извините, если это было непонятно. В любом случае, я постараюсь связаться и посмотреть, можно ли прояснить эту часть. - person Felix Kling; 04.03.2015
comment
Последнее замечание, касающееся логических атрибутов: наличие логического атрибута у элемента представляет истинное значение, а отсутствие атрибута представляет ложное значение.. Вы можете «представить» true путем добавления значения ASCII, но это только представление. Фактическим значением является логическое значение true или false — возможно, это только семантика, но, возможно, это одно из тех исключений. - person blurfus; 05.03.2015
comment
Хорошо это или плохо, но я отправил w3.org/Bugs/Public/show_bug .cgi?id=28139. Давай посмотрим что происходит. - person Felix Kling; 05.03.2015
comment
@ochi — ты запутался. Спецификация HTML предназначена для разметки, спецификация DOM — для DOM. HTML имеет концепцию логических атрибутов (checked, selected, disabled), которые не имеют значения в разметке. DOM пытается согласовать это со свойствами и атрибутами. Атрибуты представляют собой фактические значения разметки, полученные с помощью getAttribute, поэтому они должны быть строками. HTML не может иметь никакого другого типа. Проблема для спецификации DOM заключается в том, что должен возвращать getAttribute для атрибута, который не имеет значения? - person RobG; 05.03.2015
comment
Ах! Понятно... в этом и заключается мое замешательство... тем не менее, я только цитирую собственную цитату спецификации HTML Феликса... o.0 (вопрос задан о разметке, верно?) - person blurfus; 05.03.2015