¿Cómo deshabilitar el botón HTML usando JavaScript?

186

He leído que puede deshabilitar (hacer físicamente imposible hacer clic) un botón HTML simplemente agregando disablesu etiqueta, pero no como un atributo, de la siguiente manera:

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

Dado que esta configuración no es un atributo, ¿cómo puedo agregar esto dinámicamente a través de JavaScript para deshabilitar un botón que estaba habilitado anteriormente?

Jack Roscoe
fuente

Respuestas:

274

Dado que esta configuración no es un atributo

Es un atributo

Algunos atributos se definen como booleanos, lo que significa que puede especificar su valor y dejar todo lo demás fuera. es decir, en lugar de disabled = " disabled ", incluye solo la parte en negrita. En HTML 4, debe incluir solo la parte en negrita ya que la versión completa está marcada como una característica con soporte limitado (aunque eso es menos cierto ahora que cuando se escribió la especificación).

A partir de HTML 5, las reglas han cambiado y ahora incluye solo el nombre y no el valor. Esto no hace una diferencia práctica porque el nombre y el valor son iguales.

La propiedad DOM también se llama disabledy es un valor booleano que toma trueo false.

foo.disabled = true;

En teoría, también puede foo.setAttribute('disabled', 'disabled');y foo.removeAttribute("disabled"), pero no confiaría en esto con versiones anteriores de Internet Explorer (que son notoriamente defectuosas en lo que respecta a setAttribute).

Quentin
fuente
¿Tendría sentido hacer ambas cosas, cambiar la propiedad y establecer el atributo o es simplemente una exageración?
v010dya
¿Qué es fooen foo.disabled = true;? ¿Es la identificación de ese botón?
apilar
@stack: una variable que contiene una referencia al elemento recopilado a través de los medios que desee (por ejemplo, querySelector)
Quentin el
146

deshabilitar

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

para permitir

document.getElementById("btnPlaceOrder").disabled = false; 
kaushar
fuente
3
Por alguna razón, esto funcionó para mí, aunque $('#btnPlaceOrder').disabled = false;no lo hace.
levininja
44
Utilicé $('#btnPlaceOrder')[0].disabled = falsecomo el selector jquery parece devolver una matriz. Encogimiento de hombros.
Frío
66
jquery! == javascript. jquery devuelve un selector tipo matriz.
AnilRedshift
@levininja, Chilly - $ ('# btnPlaceOrder'). prop ('deshabilitado', falso);
Dominik Späte
22

Es un atributo, pero uno booleano (por lo que no necesita un nombre, solo un valor, lo sé, es raro). Puede establecer la propiedad equivalente en Javascript:

document.getElementsByName("myButton")[0].disabled = true;
Andy E
fuente
2
Necesita un valor, es el nombre que no necesita. (Extraño pero cierto).
Quentin
1
@David: Recuerdo haber leído eso antes, arreglado. De hecho, es extraño y probablemente tendría más sentido si los resaltadores de sintaxis lo honraran correctamente :-)
Andy E
10

Intenta lo siguiente:

document.getElementById("id").setAttribute("disabled", "disabled");
Maksim Kondratyuk
fuente
44
Como mencionó David Dorward , esto no se puede confiar en un navegador cruzado adecuado y en su lugar se debe usar el equivalente de propiedad.
Andy E
9

La forma oficial de establecer el disabledatributo en un HTMLInputElementes esta:

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');

Si bien la respuesta de @ kaushar es suficiente para habilitar y deshabilitar un HTMLInputElement, y probablemente sea preferible para la compatibilidad entre navegadores debido a la falla histórica de IE setAttribute, solo funciona porque las Elementpropiedades sombrean los Elementatributos. Si se establece una propiedad, el DOM usa el valor de la propiedad por defecto en lugar del valor del atributo equivalente.

Hay una diferencia muy importante entre propiedades y atributos. Un ejemplo de una HTMLInputElement propiedad verdadera es input.value, y a continuación se muestra cómo funciona el sombreado:

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

Eso es lo que significa decir que las propiedades sombrean los atributos. Este concepto también se aplica a las propiedades heredadas en la prototypecadena:

Espero que esto aclare cualquier confusión sobre la diferencia entre propiedades y atributos.

Patrick Roberts
fuente
5

Sigue siendo un atributo. Ajustándolo a:

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

... es válido.

Oli
fuente
1
Válido, pero la especificación dice que se debe evitar la sintaxis: w3.org/TR/html4/appendix/notes.html#hB.3.3
Quentin
2
Todos los navegadores buscan disabled = "disabled", sé que la especificación dice evitarlo, pero nunca he tenido ningún problema al configurar disabled = "disabled" o check = "Checked" o selected = "selected" ... Simplemente no ' t do disabled = "true" ... solo algunos navegadores reconocerán eso
Bob Fincheimer
Claramente, no todos los navegadores lo admiten: la especificación no sería tan explícita si no lo hicieran. Ya no son de uso común.
Quentin
1
Por cierto, la pregunta dice "¿cómo puedo agregar esto dinámicamente a través de JavaScript"
Quentin
Claro, pero la pregunta continúa hablando de que la discapacidad no es un atributo. Mi respuesta es sobre disipar eso y decir que puedes usarlo como un atributo. También puede usar la propiedad DOM.
Oli
4

Si tiene el objeto botón, llamado b: b.disabled=false;

dplass
fuente
3

Creo que la mejor manera podría ser:

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

Funciona bien entre navegadores.

Benito
fuente
44
debería ser prop, no attr.
Antti Haapala
1
cuestión está en busca de una solución nativa JS
behradkhodayar
0
<button disabled=true>text here</button>

Todavía puedes usar un atributo. Simplemente use el atributo 'deshabilitado' en lugar de 'valor'.

anónimo
fuente
Es disabled="disabled"o solo disabled. Cualquier valor de cadena es equivalente a "disabled", incluidos disabled="true"y disabled="false".
user4642212