Офіційний спосіб встановити 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тінь властивостейElement властивості. Якщо властивість встановлено, то 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ланцюга:
function Parent() {
this.property = 'ParentInstance';
}
Parent.prototype.property = 'ParentPrototype';
// ES5 inheritance
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;
function Child() {
// ES5 super()
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)');
// below is for demonstration purposes
// don't ever actually use document.write(), eval(), or access __proto__
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);
}
Я сподіваюся, що це вияснює будь-яку плутанину щодо різниці між властивостями та атрибутами.