จะปิดการใช้งานปุ่ม HTML โดยใช้ JavaScript ได้อย่างไร


185

ฉันได้อ่านแล้วว่าคุณสามารถปิดการใช้งาน (ทำให้ไม่สามารถคลิกทางกายภาพ) ปุ่ม HTML เพียงแค่ต่อท้ายdisableแท็ก แต่ไม่สามารถใช้เป็นแอตทริบิวต์ได้ดังต่อไปนี้:

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

เนื่องจากการตั้งค่านี้ไม่ใช่แอตทริบิวต์ฉันจะเพิ่มสิ่งนี้ในแบบไดนามิกผ่าน JavaScript เพื่อปิดใช้งานปุ่มที่เปิดใช้ก่อนหน้านี้ได้อย่างไร

คำตอบ:


274

เนื่องจากการตั้งค่านี้ไม่ใช่แอตทริบิวต์

มันเป็นคุณสมบัติ

บางแอททริบิวต์ถูกกำหนดเป็นบูลีนซึ่งหมายความว่าคุณสามารถระบุค่าของมันและปล่อยทุกอย่างออก เช่นแทนที่จะปิดใช้งาน = " ปิดใช้งาน " คุณจะรวมเฉพาะส่วนที่เป็นตัวหนา ใน HTML 4 คุณควรจะรวมเฉพาะส่วนที่เป็นตัวหนาเป็นเวอร์ชันเต็มถูกทำเครื่องหมายเป็นคุณลักษณะที่มีการสนับสนุนที่ จำกัด (ถึงแม้ว่ามันจะเป็นความจริงน้อยตอนนี้แล้วเมื่อสเปคที่เขียน)

ตั้งแต่ HTML 5 กฎมีการเปลี่ยนแปลงและตอนนี้คุณรวมเฉพาะชื่อและไม่ใช่ค่า สิ่งนี้ทำให้ไม่มีความแตกต่างในทางปฏิบัติเพราะชื่อและค่าเหมือนกัน

คุณสมบัติ DOMจะเรียกว่าdisabledและเป็นบูลีนที่ใช้หรือtruefalse

foo.disabled = true;

ในทางทฤษฎีคุณยังสามารถfoo.setAttribute('disabled', 'disabled');และfoo.removeAttribute("disabled")แต่ผมจะไม่ไว้วางใจนี้กับรุ่นเก่าของ Internet Explorer (ซึ่งเป็นฉาวโฉ่รถเมื่อมันมาถึงsetAttribute)


มันจะสมเหตุสมผลไหมที่จะทำทั้งสองอย่างเปลี่ยนคุณสมบัติและตั้งค่าคุณสมบัติหรือเป็นเพียง overkill หรือไม่?
v010dya

มีอะไรfooในfoo.disabled = true;? มันเป็นรหัสของปุ่มนั้นหรือไม่?
กอง

@stack - ตัวแปรที่อ้างอิงถึงองค์ประกอบที่รวบรวมผ่านสิ่งที่คุณต้องการ (เช่น querySelector)
Quentin

146

เพื่อปิดการใช้งาน

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

การเปิดใช้งาน

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

3
ด้วยเหตุผลบางอย่างสิ่งนี้ได้ผลสำหรับฉันแม้ว่า$('#btnPlaceOrder').disabled = false;จะไม่ได้
levininja

4
ฉันใช้$('#btnPlaceOrder')[0].disabled = falseเป็นตัวเลือก jquery ดูเหมือนว่าจะส่งกลับอาร์เรย์ ยัก.
Chilly

6
jquery! == javascript jquery ส่งคืนตัวเลือกที่เหมือนอาร์เรย์
AnilRedshift

@levininja, Chilly - $ ('# btnPlaceOrder'). prop ('ปิดใช้งาน', เท็จ);
Dominik Späte

22

มันเป็นคุณลักษณะ แต่เป็นบูลีน (ดังนั้นจึงไม่ต้องการชื่อเพียงค่า - ฉันรู้ว่ามันแปลก) คุณสามารถตั้งค่าคุณสมบัติที่เทียบเท่าได้ใน Javascript:

document.getElementsByName("myButton")[0].disabled = true;

2
มันต้องการค่ามันเป็นชื่อที่ไม่ต้องการ (แปลก แต่จริง)
เควนติน

1
@ David: ฉันจำได้ว่าอ่านก่อนหน้านี้ได้รับการแก้ไข มันแปลกจริง ๆ และอาจจะเหมาะสมกว่านี้หากผู้เน้นข้อความเน้นไวยากรณ์ให้เกียรติอย่างถูกต้อง :-)
Andy E

10

ลองทำสิ่งต่อไปนี้:

document.getElementById("id").setAttribute("disabled", "disabled");

4
ดังที่David Dorward กล่าวถึงสิ่งนี้ไม่สามารถพึ่งพาข้ามเบราว์เซอร์ได้อย่างถูกต้องและควรใช้คุณสมบัติที่เทียบเท่ากันแทน
Andy E

9

วิธีที่เป็นทางการในการตั้งค่า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เชน:

ฉันหวังว่าสิ่งนี้จะชี้แจงความสับสนเกี่ยวกับความแตกต่างระหว่างคุณสมบัติและคุณลักษณะ


5

มันยังคงเป็นคุณลักษณะ ตั้งค่าเป็น:

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

... ถูกต้อง


1
ถูกต้อง แต่สเป็คบอกว่าควรหลีกเลี่ยงไวยากรณ์: w3.org/TR/html4/appendix/notes.html#hB.3.3
Quentin

2
เบราว์เซอร์ทั้งหมดมองหาพิการ = "ปิดการใช้งาน" ฉันรู้สเป็คว่าควรหลีกเลี่ยง แต่ฉันไม่เคยมีปัญหาใด ๆ ในการตั้งค่าถูกปิดใช้งาน = "ปิดใช้งาน" หรือเลือก = "ถูกตรวจสอบ" หรือเลือก = "เลือก" ... t do disabled = "true" ... มีเพียงบางเบราว์เซอร์เท่านั้นที่จะรับรู้ได้
Bob Fincheimer

เห็นได้ชัดว่าไม่ใช่ทุกเบราว์เซอร์ที่รองรับสเป็คนั้นจะไม่ชัดเจนหากไม่มี พวกเขาไม่ได้ใช้งานร่วมกันอีกต่อไป
Quentin

1
BTW คำถามบอกว่า "ฉันจะเพิ่มสิ่งนี้ในแบบไดนามิกผ่าน JavaScript" ได้อย่างไร
Quentin

แน่นอน แต่คำถามยังคงมีการพูดคุยเกี่ยวกับการปิดการใช้งานไม่ได้เป็นคุณลักษณะ คำตอบของฉันเกี่ยวกับการปัดเป่าและบอกว่าคุณสามารถใช้มันเป็นคุณสมบัติ คุณยังสามารถใช้คุณสมบัติ DOM
Oli


3

ฉันคิดว่าวิธีที่ดีที่สุดน่าจะเป็น:

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

มันทำงานได้ดีข้ามเบราว์เซอร์


4
มันควรจะเป็นไม่ได้prop attr
Antti Haapala

1
คำถามกำลังมองหา native js solution
behradkhodayar

0
<button disabled=true>text here</button>

คุณยังคงสามารถใช้คุณสมบัติได้ เพียงใช้แอตทริบิวต์ 'ปิดการใช้งาน' แทน 'ค่า'


มันหรือเพียงแค่disabled="disabled" disabledค่าสตริงใดจะเทียบเท่ากับการ"disabled"รวมทั้งและdisabled="true" disabled="false"
user4642212
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.