Явно установленный disabled=false в HTML не работает

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

Я могу отключить кнопку с помощью

$("#btn").attr("disabled","true")

но затем html, содержащий:

<button id="btn" disabled="false">I want to be enabled!</button>

по-прежнему показывает кнопку как отключенную. Инспектор показывает:

<button id="btn" disabled="">I want to be enabled!</button>

я знаю, что могу сделать

$("#btn").removeAttr("disabled") 

или подобное, но это неудобно делать для многих элементов в html.


person aless80    schedule 23.09.2015    source источник
comment
"но это неудобно делать для многих элементов в html"... почему?   -  person Sebastian Simon    schedule 23.09.2015


Ответы (4)


Удивительно, но HTML не использует логические значения для логических атрибутов.

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

<input type="checkbox" disabled>                 <!-- HTML -->
<input type="checkbox" disabled />               <!-- Also HTML -->
<input type="checkbox" disabled="disabled" />    <!-- XHTML and HTML -->

Это задокументировано в спецификации HTML: http://www.w3.org/TR/html5/infrastructure.html#boolean-attribute

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

Значения true и false не разрешены для логических атрибутов. Чтобы представить ложное значение, атрибут должен быть полностью опущен.


Чтобы добавить путаницы, в DOM эти логические атрибуты задаются логическими значениями, например:

/** @type HTMLInputElement */
const inputElement = document.createElement('input');

inputElement.disabled = true; // <-- The DOM *does* use a proper boolean value here.
console.log( inputElement.disabled ); // Prints "true"

inputElement.disabled = false;
console.log( inputElement.disabled ); // Prints "false"

...чтобы добавить еще больше путаницы - из-за ложности JavaScript - использование строковых значений со свойством не будет работать так, как вы ожидаете:

inputElement.disabled = 'true';
console.log( inputElement.disabled ); // Prints "true"

inputElement.disabled = 'false';
console.log( inputElement.disabled ); // *Still* prints "true"

(Это связано с тем, что строка JavaScript 'false' не приведена к типу в логическое значение JavaScript false).


Кроме того, некоторые HTML-атрибуты имеют возможные значения true и false, например contentEditable (который также имеет inherit в качестве третьего варианта), также рассмотрите <form autocomplete="">, который может быть on и off (и многими другими значениями), что также может сбить некоторых людей с толку. Я думаю, что некоторые устаревшие расширения (эры Internet Explorer 4.0), такие как <object> и <applet>, могли иметь логические атрибуты и определенно имели логические значения в своих дочерних атрибутах <param value="">, на данный момент это просто исторический курьез).

person Dai    schedule 23.09.2015
comment
Спасибо за информацию. Однако опущение disabled не означает отключение disabled (это то, что мне нужно). Я только что отключил элемент на www.google.com и перезагрузил страницу. Этот элемент по-прежнему отключен - person aless80; 23.09.2015
comment
@ aless80 Элемент не должен оставаться отключенным после перезагрузки страницы. Что именно ты делаешь? - person Dai; 23.09.2015
comment
Я даю вам сценарий. Я использую фаерфокс. 1) Скажите, что моя веб-страница останавливает выполнение (из-за ошибки, потому что я отлаживаю или обновляю страницу), пока кнопка отключена. Когда я обновляю страницу (не жесткое обновление!), кнопка будет отключена. По этой причине я хотел бы отключить в html. Извините, пренебрегайте тем, что я написал выше о google.com. - person aless80; 23.09.2015
comment
@ aless80 Что вы подразумеваете под жестким обновлением? - person Dai; 23.09.2015
comment
Жесткое обновление = Ctrl+Shift+R или Shift+F5 Жесткое обновление — это способ очистки кэша браузера для определенной страницы, чтобы принудительно загрузить самую последнюю версию страницы. - person aless80; 23.09.2015

В будущем может кому поможет.

selectLanguage.onchange = function() {
    var value = selectLanguage.value;
    if (value != '') {
        submitLanguage.removeAttr('disabled');
    } else {
        submitLanguage.attr('disabled', 'disabled');
    }
    // submitLanguage.attr('enabled', 'enabled');
}
person Alex    schedule 29.08.2017

Я знаю, что это старая тема, но поскольку нет отмеченного ответа, помогает ли это? Это действительно отвечает на явно помеченный как включенный вопрос.

<button enabled>My Text</button>
<!-- Which also works as: -->
<button enabled="enabled">My Text</button>

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

person Adsy2010    schedule 14.06.2017
comment
Да, мой пост довольно старый, и я больше не могу воспроизвести проблему (получение отключенной кнопки, например, из-за сбоя кода). Вы уверены, что нашли пример, когда кнопка отключена при запуске страницы, а добавление включено включает ее? - person aless80; 15.06.2017
comment
На самом деле я не тестировал его с обоими тегами. интересно, если включен тег disabled, enable не включает его. Похоже, что приоритет переходит в отключенное состояние. Однако очевидно, что (конечно, я не знаю, как выглядела ваша исходная проблема с кодом) программно можно было бы включить или отключить одну переменную. например, <button $enabled>, а затем установите его либо включенным, либо отключенным в это время. - person Adsy2010; 16.06.2017
comment
ах, видите, я думал, что вы сможете передать логическое значение, например. ‹button enabled=false› Ура! - person Ciaran Gallagher; 28.03.2018

Если вы используете AngularJS, попробуйте вместо этого ng-disabled. В этом случае вы можете использовать такие вещи, как:

ng-disabled="true"
ng-disabled="false"
ng-disabled={{expression}}

и он работает как положено....

person Daniel Perník    schedule 09.03.2017