Установка ложного значения против удаления атрибута - PullRequest
7 голосов
/ 08 января 2012

Я читал что-то о логическом атрибуте здесь , который говорит, что для логического атрибута (в данном конкретном примере loop атрибут <audio>), какое бы значение вы ни указали, оно будет быть признанным как «правда». Для того, чтобы действительно установить в ложное значение, вы не можете установить его как loop=false или с javascript как ['loop']=false, но должны удалить атрибут, например, выполнив removeAttribute('loop'). Это правда?

Сначала я поверил в это, но если проверить это с помощью Chrome, кажется, что установка на ['loop']=false действительно сделает его признанным ложным. Я не уверен, насколько надежен этот факт, когда рассматривается кросс-браузер. Есть ли разница между браузерами?

Ответы [ 4 ]

6 голосов
/ 08 января 2012

Логические атрибуты объясняются здесь:

http://www.w3.org/TR/html4/intro/sgmltut.html#h-3.3.4.2

Некоторые атрибуты играют роль логических переменных (например, выбранный атрибут для элемента OPTION).Их появление в начальном теге элемента означает, что значение атрибута равно «true».Их отсутствие подразумевает значение «false».

Логические атрибуты могут по закону принимать одно значение: имя самого атрибута (например, selected = "selected").

Таким образом, хотя некоторые браузеры могут интерпретировать строку «false», как если бы это значение не было установлено, другие могут не принять решение (что является правильным поведением).На самом деле, насколько я знаю (или думал ), любая непустая строка обычно устанавливает значение on / true (независимо от того, что в спецификации указано как допустимое значение).Я считаю, что это также неопределенное поведение, поэтому оно может меняться или отличаться от браузера к браузеру (не полагайтесь на него).

Суть в том, что один или два браузера могут отличаться отспецификация не означает, что вы должны.Полное удаление атрибута - это путь.

Приложение : Глядя на ваши комментарии и вопрос немного ближе, я думаю, вы можете быть смущены значениями атрибутов в целом.В HTML attr=false и attr="false" абсолютно одинаковы.Кавычки не требуются в любой версии HTML (если они не нужны для устранения неоднозначности, когда значение содержит пробелы).Например:

<input class=required>
<!-- This is fine -->

<input class=title required>
<!-- this is fine too, but "required" will be parsed as an attribute -->

<input class="title required">
<!-- To have two classes, we need the quotes -->

Все значения атрибутов (для элементов, которые их имеют) обрабатываются как строки.Другими словами, в HTML нет такой вещи, как истинное логическое значение (или NULL значение), как в javascript.

1 голос
/ 08 января 2012

Элемент audio является элементом HTML5, поэтому в отношении его значения вам следует ознакомиться с черновиками HTML5.В этом случае см. Определение логических атрибутов в версии для разработчиков черновика WHATWG.В сущности, он говорит, что a) что наличие или отсутствие атрибута определяет, является ли значение атрибута DOM true или false, и b) как требование к документам, значение должно быть пустым или (без учета регистра)) имя атрибута, в данном случае loop='' или loop="loop".Использование кавычек вокруг значения определяется в другом месте.

Таким образом, браузеры должны распознавать loop=false, чтобы означать то же самое, что и loop=loop или loop=true, но авторы не должны использовать такие конструкции, иПроверяющие HTML5 выдают о них сообщения об ошибках.

(По сути, вы должны использовать только loop в сериализации HTML5 HTML и loop="loop" в сериализации XHTML.)

Таким образом, еслиу вас есть переменная x в JavaScript с элементом элемента audio в качестве значения, x.loop имеет значение true или false, тогда как x.attributes['loop'].value указывает значение, используемое в разметке HTML (что обычно не интереснокак таковой).

Существует еще одно осложнение в отношении Firefox: он все еще не поддерживает атрибут loop (см. вопрос HTML5 Audio Looping ).Это означает, что если вы установите, например, loop="loop", x.attributes['loop'].value будет loop, но Firefox даже не установит x.loop (т. Е. Это undefined), еще меньше реализует функциональность.

1 голос
/ 08 января 2012

Точно так же любой, кому это понадобится в будущем:

loop=false, остается true, если не удален весь атрибут loop.По сути, наличие только loop - это то, что тег должен делать для чего-то еще.Вам нужно использовать что-то вроде jQuery для удаления атрибута entier loop (или, по крайней мере, это то, что я бы сделал).Теперь, если вы установите другой неопределенный атрибут на false, тогда вы сможете распознать его как false.

0 голосов
/ 08 января 2012

Вы путаете строки и настоящие логические типы.Javascript имеет логический тип данных с двумя возможными значениями true и false (без кавычек).Строки могут содержать любой текст, поэтому они могут содержать «true» и «false» с кавычками.Если для свойства задано ненулевое и ненулевое значение, получится значение true, поэтому будет получено следующее:

var a = true; // true
var b = false; // false
var c = "true"; // true
var d = "false" // true
var e = null; // false;
var f = 0; // false
var g = 1; // true

Обратите внимание на сходство с C.

...