Como desativar o botão HTML usando JavaScript?

186

Li que você pode desativar (tornar fisicamente impossível de clicar) um botão HTML simplesmente anexando disableà sua tag, mas não como um atributo, da seguinte maneira:

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

Como essa configuração não é um atributo, como posso adicioná-lo dinamicamente via JavaScript para desativar um botão que foi ativado anteriormente?

Jack Roscoe
fonte

Respostas:

274

Como essa configuração não é um atributo

É um atributo.

Alguns atributos são definidos como booleanos, o que significa que você pode especificar seu valor e deixar todo o resto de fora. Em vez de desativado = " desativado ", você inclui apenas a parte em negrito. No HTML 4, você deve incluir apenas a parte em negrito, pois a versão completa é marcada como um recurso com suporte limitado (embora isso seja menos verdadeiro agora do que quando a especificação foi escrita).

No HTML 5, as regras foram alteradas e agora você inclui apenas o nome e não o valor. Isso não faz diferença prática, porque o nome e o valor são os mesmos.

A propriedade DOM também é chamada disablede é um booleano que leva trueor false.

foo.disabled = true;

Em teoria, você também pode foo.setAttribute('disabled', 'disabled');e foo.removeAttribute("disabled"), mas eu não confiaria nisso nas versões mais antigas do Internet Explorer (que são notoriamente problemáticas quando se trata setAttribute).

Quentin
fonte
Faria sentido fazer as duas coisas, alterar a propriedade e definir o atributo ou é apenas um exagero?
v010dya
O que é fooem foo.disabled = true;? É o id desse botão?
empilhe
@stack - Uma variável mantendo uma referência ao elemento coletados através de qualquer meio que você gosta (por exemplo querySelector)
Quentin
146

desabilitar

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

habilitar

document.getElementById("btnPlaceOrder").disabled = false; 
Kaushar
fonte
3
Por alguma razão, isso funcionou para mim, embora $('#btnPlaceOrder').disabled = false;não funcione.
levininja
4
Eu usei $('#btnPlaceOrder')[0].disabled = falsecomo o seletor jquery parece retornar uma matriz. Dar de ombros.
Chilly
6
jquery! == javascript. jquery retorna um seletor de matriz.
AnilRedshift
@levininja, Chilly - $ ('# btnPlaceOrder'). prop ('desativado', falso);
Dominik Späte
22

É um atributo, mas é booleano (por isso não precisa de um nome, apenas de um valor - eu sei, é estranho). Você pode definir a propriedade equivalente em Javascript:

document.getElementsByName("myButton")[0].disabled = true;
Andy E
fonte
2
Precisa de um valor, é o nome que não precisa. (Estranho mas verdade).
Quentin
1
@ David: Lembro-me de ler isso antes, corrigido. É realmente estranho e provavelmente faria mais sentido se marcadores de sintaxe honrado corretamente :-)
Andy E
10

Tente o seguinte:

document.getElementById("id").setAttribute("disabled", "disabled");
Maksim Kondratyuk
fonte
4
Como David Dorward mencionou , isso não pode ser utilizado adequadamente em vários navegadores e o equivalente à propriedade deve ser usado.
Andy E
9

A maneira oficial de definir o disabledatributo em um 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');

Embora a resposta do @ kaushar seja suficiente para ativar e desativar um HTMLInputElement, e provavelmente seja preferível para compatibilidade entre navegadores devido ao histórico de bugs do IE setAttribute, ele só funciona porque as Elementpropriedades sombreamElement atributos. Se uma propriedade estiver configurada, o DOM usará o valor da propriedade por padrão, em vez do valor do atributo equivalente.

Há uma diferença muito importante entre propriedades e atributos. Um exemplo de uma HTMLInputElement propriedade true é input.valuee, abaixo, demonstra como o sombreamento funciona:

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" />

É isso que significa dizer que as propriedades sombreiam os atributos. Este conceito também se aplica às propriedades herdadas da prototypecadeia:

Espero que isso esclareça qualquer confusão sobre a diferença entre propriedades e atributos.

Patrick Roberts
fonte
5

Ainda é um atributo. Configurando para:

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

... é válido.

Oli
fonte
1
Válido, mas a especificação diz que a sintaxe deve ser evitada: w3.org/TR/html4/appendix/notes.html#hB.3.3
Quentin
2
Todos os navegadores procuram disabled = "disabled", eu sei que as especificações dizem para evitá-lo, mas nunca tive problemas ao definir disabled = "disabled" ou marcado = "selected" ou selected = "selected" ... t do = deficientes "verdadeiros" ... apenas alguns navegadores irá reconhecer que
Bob Fincheimer
Claramente, nem todos os navegadores suportam - a especificação não seria tão explícita se não o fizessem. Eles simplesmente não estão mais em uso comum.
Quentin
1
BTW, a questão diz "como eu posso adicionar isso em dinamicamente via JavaScript"
Quentin
Claro, mas a questão continua a falar sobre deficientes não serem um atributo. Minha resposta é sobre dissipar isso e dizer que você pode usá-lo como um atributo. Você também pode usar a propriedade DOM.
Oli
4

Se você possui o objeto button, chamado b: b.disabled=false;

dplass
fonte
3

Eu acho que a melhor maneira poderia ser:

$("#ctl00_ContentPlaceHolder1_btnPlaceOrder").attr('disabled', true);

Funciona bem em vários navegadores.

Benito
fonte
4
deveria ser prop, não attr.
Antti Haapala
1
questão está à procura de solução js nativa
behradkhodayar
0
<button disabled=true>text here</button>

Você ainda pode usar um atributo. Basta usar o atributo 'disabled' em vez de 'value'.

anônimo
fonte
É disabled="disabled"ou apenas disabled. Qualquer valor de string é equivalente a "disabled", incluindo disabled="true"e disabled="false".
User4642212