วิธีที่เป็นทางการในการตั้งค่า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);
}
ฉันหวังว่าสิ่งนี้จะชี้แจงความสับสนเกี่ยวกับความแตกต่างระหว่างคุณสมบัติและคุณลักษณะ