Comment désactiver le bouton HTML en utilisant JavaScript?

189

J'ai lu que vous pouvez désactiver (rendre physiquement non cliquable) un bouton HTML simplement en l'ajoutant disableà sa balise, mais pas en tant qu'attribut, comme suit:

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

Étant donné que ce paramètre n'est pas un attribut, comment puis-je l'ajouter de manière dynamique via JavaScript pour désactiver un bouton précédemment activé?

Jack Roscoe
la source

Réponses:

274

Étant donné que ce paramètre n'est pas un attribut

C'est un attribut.

Certains attributs sont définis comme booléens, ce qui signifie que vous pouvez spécifier leur valeur et laisser tout le reste de côté. c'est-à-dire qu'au lieu de disabled = " disabled ", vous incluez uniquement la partie en gras. En HTML 4, vous ne devez inclure que la partie en gras car la version complète est marquée comme une fonctionnalité avec un support limité (bien que cela soit moins vrai maintenant que lorsque la spécification a été écrite).

Depuis HTML 5, les règles ont changé et maintenant vous n'incluez que le nom et non la valeur. Cela ne fait aucune différence pratique car le nom et la valeur sont identiques.

La propriété DOM est également appelée disabledet est un booléen qui prend trueou false.

foo.disabled = true;

En théorie, vous pouvez aussi foo.setAttribute('disabled', 'disabled');et foo.removeAttribute("disabled"), mais je ne ferais pas confiance à cela avec les anciennes versions d'Internet Explorer (qui sont notoirement boguées en ce qui concerne setAttribute).

Quentin
la source
Serait-il judicieux de faire les deux, de modifier la propriété et de définir l'attribut ou s'agit-il simplement d'une exagération?
v010dya
Ce qui est fooen foo.disabled = true;? Est-ce l'identifiant de ce bouton?
stack le
@stack - Une variable contenant une référence à l'élément collecté par tout moyen que vous voulez (par exemple, querySelector)
Quentin
150

désactiver

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

autoriser

document.getElementById("btnPlaceOrder").disabled = false; 
Kaushar
la source
3
Pour une raison quelconque, cela a fonctionné pour moi même si $('#btnPlaceOrder').disabled = false;cela ne fonctionne pas.
levininja
4
J'ai utilisé $('#btnPlaceOrder')[0].disabled = falsecomme sélecteur jquery semble renvoyer un tableau. Hausser les épaules.
Chilly
6
jquery! == javascript. jquery renvoie un sélecteur de type tableau.
AnilRedshift
@levininja, Chilly - $ ('# btnPlaceOrder'). prop ('désactivé', faux);
Dominik Späte
22

C'est un attribut, mais booléen (donc il n'a pas besoin d'un nom, juste une valeur - je sais, c'est bizarre). Vous pouvez définir la propriété équivalente en Javascript:

document.getElementsByName("myButton")[0].disabled = true;
Andy E
la source
2
Il a besoin d'une valeur, c'est le nom dont il n'a pas besoin. (Etrange mais vrai).
Quentin
1
@David: Je me souviens avoir lu ça avant, corrigé. C'est étrange en effet et aurait probablement plus de sens si les surligneurs de syntaxe l'honoraient correctement :-)
Andy E
10

Essayez ce qui suit:

document.getElementById("id").setAttribute("disabled", "disabled");
Maksim Kondratyuk
la source
4
Comme David Dorward l'a mentionné , cela ne peut pas être utilisé correctement entre les navigateurs et l'équivalent de propriété doit être utilisé à la place.
Andy E
9

La façon officielle de définir l' disabledattribut sur un HTMLInputElementest la suivante:

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

Bien que la réponse de @ kaushar soit suffisante pour activer et désactiver un HTMLInputElement, et est probablement préférable pour la compatibilité entre navigateurs en raison du buggy historique d'IE setAttribute, cela ne fonctionne que parce que les Elementpropriétés masquent les Elementattributs. Si une propriété est définie, le DOM utilise la valeur de la propriété par défaut plutôt que la valeur de l'attribut équivalent.

Il existe une différence très importante entre les propriétés et les attributs. Un exemple de HTMLInputElement propriété vraie est input.value, et ci-dessous montre comment fonctionne l'observation:

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

C'est ce que signifie dire que les propriétés ombragent les attributs. Ce concept s'applique également aux propriétés héritées de la prototypechaîne:

J'espère que cela clarifie toute confusion sur la différence entre les propriétés et les attributs.

Patrick Roberts
la source
5

C'est toujours un attribut. Réglez-le sur:

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

... est valable.

Oli
la source
1
Valide, mais la spécification dit que la syntaxe doit être évitée: w3.org/TR/html4/appendix/notes.html#hB.3.3
Quentin
2
Tous les navigateurs recherchent disabled = "disabled", je connais la spécification disons pour l'éviter, mais je n'ai jamais eu de problèmes de paramétrage disabled = "disabled" or checked = "checked" ou selected = "selected" ... Just don ' t do disabled = "true" ... seuls certains navigateurs le reconnaîtront
Bob Fincheimer
Il est clair que tous les navigateurs ne le prennent pas en charge - la spécification ne serait pas aussi explicite s'ils ne le faisaient pas. Ils ne sont tout simplement plus d'usage courant.
Quentin
1
BTW, la question dit "comment puis-je ajouter cela dynamiquement via JavaScript"
Quentin
Bien sûr, mais la question continue de parler du fait que le handicap n'est pas un attribut. Ma réponse consiste à dissiper cela et à dire que vous pouvez l'utiliser comme attribut. Vous pouvez également utiliser la propriété DOM.
Oli
4

Si vous avez l'objet bouton, appelé b: b.disabled=false;

dplass
la source
3

Je pense que le meilleur moyen pourrait être:

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

Cela fonctionne bien entre les navigateurs.

Benito
la source
4
ça devrait être prop, non attr.
Antti Haapala
2
question est à la recherche d'une solution native js
BehradKhodayar
0
<button disabled=true>text here</button>

Vous pouvez toujours utiliser un attribut. Utilisez simplement l'attribut «désactivé» au lieu de «valeur».

anonyme
la source
C'est disabled="disabled"ou juste disabled. Toute valeur de chaîne équivaut à "disabled", y compris disabled="true"et disabled="false".
user4642212