Как отключить кнопку HTML с помощью JavaScript?


186

Я читал, что вы можете отключить (сделать физически не кликабельным) кнопку HTML, просто добавив disableее тег, но не как атрибут, как показано ниже:

<input type="button" name=myButton value="disable" disabled>

Поскольку этот параметр не является атрибутом, как я могу добавить его динамически через JavaScript, чтобы отключить кнопку, которая была ранее включена?

Ответы:


274

Поскольку этот параметр не является атрибутом

Это атрибут.

Некоторые атрибуты определены как логические, что означает, что вы можете указать их значение и пропустить все остальное. т.е. вместо disabled = " disabled ", вы включаете только жирную часть. В HTML 4 вы должны включать только часть, выделенную жирным шрифтом, поскольку полная версия помечена как функция с ограниченной поддержкой (хотя сейчас это менее верно, чем при написании спецификации).

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

Свойство DOM также называется disabledи является логическим значением, которое принимает trueили false.

foo.disabled = true;

Теоретически вы также можете foo.setAttribute('disabled', 'disabled');и foo.removeAttribute("disabled"), но я бы не стал доверять этому с более старыми версиями Internet Explorer (которые, как известно, глючат, когда дело доходит до setAttribute).


Имеет ли смысл сделать и то, и другое, изменить свойство и установить атрибут или это просто перебор?
v010дя

Что fooвнутри foo.disabled = true;? Это идентификатор этой кнопки?
стек

@stack - переменная, содержащая ссылку на элемент, собранный любым удобным для вас способом (например, querySelector)
Квентин

146

отключить

document.getElementById("btnPlaceOrder").disabled = true; 

включить

document.getElementById("btnPlaceOrder").disabled = false; 

3
По какой-то причине это сработало для меня, хотя $('#btnPlaceOrder').disabled = false;и не работает.
Левининя

4
Я использовал $('#btnPlaceOrder')[0].disabled = falseкак селектор jquery, кажется, возвращает массив. Shrug.
холодно

6
JQuery! == Javascript. jquery возвращает подобный массиву селектор.
AnilRedshift

@levininja, Chilly - $ ('# btnPlaceOrder'). prop ('disabled', false);
Доминик Спате

22

Это атрибут, но логический (поэтому ему не нужно имя, просто значение - я знаю, это странно). Вы можете установить эквивалент свойства в Javascript:

document.getElementsByName("myButton")[0].disabled = true;

2
Ему нужно значение, это имя, которое ему не нужно. (Удивительно, но факт).
Квентин

1
@ Давид: Я помню, что читал это раньше, исправлено. Это действительно странно и, вероятно, имело бы больше смысла, если бы подсветки синтаксиса выполняли его правильно :-)
Энди Э


9

Официальный способ установить disabledатрибут на HTMLInputElementэто:

var input = document.querySelector('[name="myButton"]');
// Without querySelector API
// var input = document.getElementsByName('myButton').item(0);

// disable
input.setAttribute('disabled', true);
// enable
input.removeAttribute('disabled');

Хотя ответа @ kaushar достаточно для включения и отключения HTMLInputElementи, вероятно, предпочтительнее для совместимости между браузерами из-за исторически ошибочной версии IE setAttribute, он работает только потому, что Elementсвойства shadowElement атрибутов . Если свойство установлено, то DOM использует значение свойства по умолчанию, а не значение эквивалентного атрибута.

Существует очень важное различие между свойствами и атрибутами. Пример истинного HTMLInputElement свойства : input.valueниже показано, как работает теневое копирование:

var input = document.querySelector('#test');

// the attribute works as expected
console.log('old attribute:', input.getAttribute('value'));
// the property is equal to the attribute when the property is not explicitly set
console.log('old property:', input.value);

// change the input's value property
input.value = "My New Value";

// the attribute remains there because it still exists in the DOM markup
console.log('new attribute:', input.getAttribute('value'));
// but the property is equal to the set value due to the shadowing effect
console.log('new property:', input.value);
<input id="test" type="text" value="Hello World" />

Вот что значит сказать, что свойства теневые атрибуты. Эта концепция также применяется к наследуемым свойствам в prototypeцепочке:

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


5

Это все еще атрибут. Установка его на:

<input type="button" name=myButton value="disable" disabled="disabled">

... действует.


1
Допустимо, но в спецификации сказано, что следует избегать синтаксиса: w3.org/TR/html4/appendix/notes.html#hB.3.3
Квентин,

2
Все браузеры ищут отключенный = "отключен", я знаю, что спецификация говорит, чтобы избежать этого, но у меня никогда не было проблем с установкой отключенного = "отключенного" или проверенного = "проверенного" или выбранного = "выбранного" ... Просто не t do disabled = "true" ... только некоторые браузеры распознают это
Боб Финхеймер

Очевидно, что не все браузеры поддерживают это - спецификация не была бы такой явной, если бы они этого не сделали. Они просто больше не используются.
Квентин

1
Кстати, вопрос говорит: «Как я могу добавить это динамически с помощью JavaScript»
Квентин

Конечно, но вопрос продолжает говорить о том, что инвалид не является атрибутом. Мой ответ о том, чтобы рассеять это и сказать, что вы можете использовать его как атрибут. Вы также можете использовать свойство DOM.
Оли

4

Если у вас есть объект кнопки с именем b: b.disabled=false;



0
<button disabled=true>text here</button>

Вы все еще можете использовать атрибут. Просто используйте атрибут «disabled» вместо «value».


Это disabled="disabled"или просто disabled. Любое строковое значение эквивалентно "disabled", включая disabled="true"иdisabled="false" .
user4642212
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.