La façon officielle de définir l' disabledattribut sur un HTMLInputElementest la suivante:
var input = document.querySelector('[name="myButton"]');
input.setAttribute('disabled', true);
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');
console.log('old attribute:', input.getAttribute('value'));
console.log('old property:', input.value);
input.value = "My New Value";
console.log('new attribute:', input.getAttribute('value'));
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:
function Parent() {
this.property = 'ParentInstance';
}
Parent.prototype.property = 'ParentPrototype';
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;
function Child() {
Parent.call(this);
this.property = 'ChildInstance';
}
Child.prototype.property = 'ChildPrototype';
logChain('new Parent()');
log('-------------------------------');
logChain('Object.create(Parent.prototype)');
log('-----------');
logChain('new Child()');
log('------------------------------');
logChain('Object.create(Child.prototype)');
function log(value) {
document.write(`<pre>${value}</pre>`);
}
function logChain(code) {
log(code);
var object = eval(code);
do {
log(`${object.constructor.name} ${object instanceof object.constructor ? 'instance' : 'prototype'} property: ${JSON.stringify(object.property)}`);
object = object.__proto__;
} while (object !== null);
}
J'espère que cela clarifie toute confusion sur la différence entre les propriétés et les attributs.