Bagaimana cara menonaktifkan tombol HTML menggunakan JavaScript?

186

Saya telah membaca bahwa Anda dapat menonaktifkan (membuat secara fisik tidak dapat diklik) tombol HTML hanya dengan menambahkan disabletag-nya, tetapi tidak sebagai atribut, sebagai berikut:

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

Karena pengaturan ini bukan atribut, bagaimana saya bisa menambahkan ini secara dinamis melalui JavaScript untuk menonaktifkan tombol yang sebelumnya diaktifkan?

Jack Roscoe
sumber

Jawaban:

274

Karena pengaturan ini bukan atribut

Itu adalah atribut.

Beberapa atribut didefinisikan sebagai boolean, yang berarti Anda dapat menentukan nilainya dan mengabaikan yang lainnya. yaitu Alih-alih dinonaktifkan = " dinonaktifkan ", Anda hanya menyertakan bagian cetak tebal. Dalam HTML 4, Anda harus memasukkan hanya bagian yang tebal karena versi lengkap ditandai sebagai fitur dengan dukungan terbatas (meskipun itu kurang benar sekarang maka ketika spesifikasi ditulis).

Pada HTML 5, aturan telah berubah dan sekarang Anda hanya memasukkan nama dan bukan nilainya. Ini tidak membuat perbedaan praktis karena nama dan nilainya sama.

The properti DOM juga disebut disableddan merupakan boolean yang mengambil trueatau false.

foo.disabled = true;

Secara teori Anda juga bisa foo.setAttribute('disabled', 'disabled');dan foo.removeAttribute("disabled"), tapi saya tidak akan mempercayai ini dengan versi Internet Explorer yang lebih lama (yang terkenal bermasalah ketika menyangkut setAttribute).

Quentin
sumber
Apakah masuk akal untuk melakukan keduanya, mengubah properti dan mengatur atribut atau itu hanya berlebihan?
v010dya
Apa yang ada di foodalam foo.disabled = true;? Apakah id tombol itu?
tumpukan
@stack - Variabel yang memegang referensi ke elemen yang dikumpulkan melalui cara apa pun yang Anda suka (mis. querySelector)
Quentin
146

untuk menonaktifkan

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

untuk mengaktifkan

document.getElementById("btnPlaceOrder").disabled = false; 
kaushar
sumber
3
Untuk beberapa alasan ini bekerja untuk saya walaupun $('#btnPlaceOrder').disabled = false;tidak.
levininja
4
Saya digunakan $('#btnPlaceOrder')[0].disabled = falsesebagai pemilih jquery tampaknya mengembalikan array. Mengangkat bahu.
Dingin
6
jquery! == javascript. jquery mengembalikan pemilih seperti array.
AnilRedshift
@levininja, Chilly - $ ('# btnPlaceOrder'). prop ('dinonaktifkan', salah);
Dominik Späte
22

Itu adalah atribut, tetapi atribut boolean (jadi tidak perlu nama, hanya nilai - saya tahu, ini aneh). Anda dapat mengatur persamaan properti di Javascript:

document.getElementsByName("myButton")[0].disabled = true;
Andy E
sumber
2
Itu memang membutuhkan nilai, itu adalah nama yang tidak perlu. (Aneh tapi Nyata).
Quentin
1
@ David: Saya ingat pernah membaca itu sebelumnya, diperbaiki. Aneh memang dan mungkin akan lebih masuk akal jika syntax highlighters menghormatinya dengan benar :-)
Andy E
10

Coba yang berikut ini:

document.getElementById("id").setAttribute("disabled", "disabled");
Maksim Kondratyuk
sumber
4
Seperti yang disebutkan oleh David Dorward , ini tidak bisa diandalkan dengan cross-browser dengan benar dan sebaliknya properti harus digunakan.
Andy E
9

Cara resmi untuk menetapkan disabledatribut pada HTMLInputElementadalah ini:

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

Sementara jawaban @ kaushar cukup untuk mengaktifkan dan menonaktifkan HTMLInputElement, dan mungkin lebih disukai untuk kompatibilitas lintas-browser karena IE secara historis buggy setAttribute, itu hanya berfungsi karena atribut atribut Elementshadow Element. Jika properti diatur, maka DOM menggunakan nilai properti secara default daripada nilai atribut yang setara.

Ada perbedaan yang sangat penting antara properti dan atribut. Contoh HTMLInputElement properti sebenarnya adalah input.value, dan di bawah ini menunjukkan cara kerja bayangan:

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

Itulah artinya mengatakan bahwa atribut atribut bayangan. Konsep ini juga berlaku untuk properti yang diwarisi pada prototyperantai:

Saya harap ini menjelaskan segala kebingungan tentang perbedaan antara properti dan atribut.

Patrick Roberts
sumber
5

Itu masih atribut. Pengaturan ke:

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

... adalah benar.

Oli
sumber
1
Valid, tetapi spec mengatakan bahwa sintaks harus dihindari: w3.org/TR/html4/appendix/notes.html#hB.3.3
Quentin
2
Semua browser mencari untuk menonaktifkan = "dinonaktifkan", saya tahu spesifikasi mengatakan untuk menghindarinya, tetapi saya tidak pernah memiliki masalah pengaturan dinonaktifkan = "dinonaktifkan" atau dicentang = "dicentang" atau dipilih = "dipilih" ... Hanya don ' t jangan dinonaktifkan = "benar" ... hanya beberapa browser yang akan mengenali itu
Bob Fincheimer
Jelas tidak semua browser mendukungnya - spesifikasi tidak akan terlalu eksplisit jika tidak. Mereka sudah tidak umum digunakan lagi.
Quentin
1
BTW, pertanyaannya mengatakan "bagaimana saya bisa menambahkan ini secara dinamis melalui JavaScript"
Quentin
Tentu tetapi pertanyaan selanjutnya adalah tentang dinonaktifkan yang bukan atribut. Jawaban saya adalah tentang menghilangkan itu dan mengatakan Anda dapat menggunakannya sebagai atribut. Anda juga dapat menggunakan properti DOM.
Oli
4

Jika Anda memiliki objek tombol, disebut b: b.disabled=false;

dplass
sumber
3

Saya pikir cara terbaik adalah:

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

Ini berfungsi lintas-browser yang baik.

Benito
sumber
4
seharusnya prop, bukan attr.
Antti Haapala
1
pertanyaan sedang mencari solusi js asli
behradkhodayar
0
<button disabled=true>text here</button>

Anda masih bisa menggunakan atribut. Cukup gunakan atribut 'dinonaktifkan' alih-alih 'nilai'.

anonim
sumber
Itu disabled="disabled"atau hanya disabled. Nilai string apa pun setara dengan "disabled", termasuk disabled="true"dan disabled="false".
user4642212