Jak wyłączyć przycisk HTML za pomocą JavaScript?

185

Przeczytałem, że możesz wyłączyć (uczynić fizycznie niemożliwym do kliknięcia) przycisk HTML po prostu dodając disabledo jego znacznika, ale nie jako atrybut, w następujący sposób:

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

Ponieważ to ustawienie nie jest atrybutem, jak mogę dodać to dynamicznie za pomocą JavaScript, aby wyłączyć przycisk, który był wcześniej włączony?

Jack Roscoe
źródło

Odpowiedzi:

274

Ponieważ to ustawienie nie jest atrybutem

To jest atrybut.

Niektóre atrybuty są zdefiniowane jako logiczne, co oznacza, że ​​możesz określić ich wartość i pominąć wszystko inne. tzn. Zamiast wyłączone = „ wyłączone ”, uwzględnisz tylko pogrubioną część. W HTML 4 powinieneś uwzględnić tylko pogrubioną część, ponieważ pełna wersja jest oznaczona jako funkcja z ograniczoną obsługą (chociaż jest to mniej prawdziwe teraz, kiedy napisano specyfikację).

Począwszy od HTML 5, reguły się zmieniły i teraz podajesz tylko nazwę, a nie wartość. Nie ma to praktycznej różnicy, ponieważ nazwa i wartość są takie same.

Nieruchomość DOM nazywana jest także disabledi to, że trwa logiczna truelub false.

foo.disabled = true;

Teoretycznie można również foo.setAttribute('disabled', 'disabled');a foo.removeAttribute("disabled"), ale nie ufam tym ze starszymi wersjami programu Internet Explorer (które są notorycznie buggy, jeśli chodzi o setAttribute).

Quentin
źródło
Czy miałoby sens zrobienie obu, zmiana właściwości i ustawienie atrybutu, czy to tylko przesada?
v010dya
Co jest foow foo.disabled = true;środku Czy to identyfikator tego przycisku?
stos
@stack - Zmienna zawierająca odniesienie do elementu zebranego za pomocą dowolnych środków (np. querySelector)
Quentin
146

wyłączyć

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

umożliwić

document.getElementById("btnPlaceOrder").disabled = false; 
kaushar
źródło
3
Z jakiegoś powodu to zadziałało dla mnie, chociaż $('#btnPlaceOrder').disabled = false;nie.
levininja
4
Użyłem, $('#btnPlaceOrder')[0].disabled = falseponieważ selektor jquery zwraca tablicę. Wzruszać ramionami.
Chłodny
6
jquery! == javascript. jquery zwraca selektor podobny do tablicy.
AnilRedshift
@levininja, Chilly - $ ('# btnPlaceOrder'). prop ('disabled', false);
Dominik Späte,
22

Jest to atrybut, ale boolowski (więc nie potrzebuje nazwy, tylko wartość - wiem, to dziwne). Możesz ustawić odpowiednik właściwości w JavaScript:

document.getElementsByName("myButton")[0].disabled = true;
Andy E.
źródło
2
Potrzebuje wartości, to nazwa, której nie potrzebuje. (Dziwne ale prawdziwe).
Quentin
1
@ David: Pamiętam, że czytałem to wcześniej, naprawione. Jest to rzeczywiście dziwne i prawdopodobnie miałoby większy sens, gdyby wyróżniki składni odpowiednio je uszanowały :-)
Andy E
10

Spróbuj wykonać następujące czynności:

document.getElementById("id").setAttribute("disabled", "disabled");
Maksim Kondratyuk
źródło
4
Jak wspomniał David Dorward , nie można polegać na odpowiedniej przeglądarce i zamiast tego należy użyć ekwiwalentu właściwości.
Andy E
9

Oficjalny sposób ustawienia disabledatrybutu na HTMLInputElementto:

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

Chociaż odpowiedź @ kaushar jest wystarczająca do włączenia i wyłączenia HTMLInputElement, i prawdopodobnie jest lepsza dla kompatybilności z różnymi przeglądarkami z powodu historycznie błędnego IE setAttribute, działa tylko dlatego, że Elementwłaściwości Elementatrybutów shadow . Jeśli właściwość jest ustawiona, DOM używa domyślnie wartości właściwości, a nie wartości równoważnego atrybutu.

Istnieje bardzo ważna różnica między właściwościami a atrybutami. Przykładem prawdziwej HTMLInputElement właściwości jest input.value, a poniżej pokazuje, jak działa cieniowanie:

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

To znaczy powiedzieć, że właściwości atrybutów cienia. Ta koncepcja dotyczy również dziedziczonych właściwości prototypełańcucha:

Mam nadzieję, że to wyjaśnia wszelkie nieporozumienia dotyczące różnicy między właściwościami a atrybutami.

Patrick Roberts
źródło
5

To wciąż atrybut. Ustawienie na:

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

... jest ważna.

Oli
źródło
1
Prawidłowe, ale specyfikacja mówi, że należy unikać składni: w3.org/TR/html4/appendix/notes.html#hB.3.3
Quentin
2
Wszystkie przeglądarki szukają wyłączone = „wyłączone”, wiem, że specyfikacja mówi, aby tego uniknąć, ale nigdy nie miałem żadnych problemów z ustawieniem wyłączone = „wyłączone” lub zaznaczone = „zaznaczone” lub wybrane = „wybrane” ... Po prostu nie t do disabled = "true" ... tylko niektóre przeglądarki to rozpoznają
Bob Fincheimer
Oczywiście nie wszystkie przeglądarki go obsługują - specyfikacja nie byłaby tak jednoznaczna, gdyby tego nie zrobiły. Po prostu nie są już w powszechnym użyciu.
Quentin,
1
BTW, pytanie brzmi „jak mogę dodać to dynamicznie przez JavaScript”
Quentin
Jasne, ale pytanie mówi dalej o tym, że niepełnosprawność nie jest atrybutem. Moja odpowiedź dotyczy rozwiania tego i powiedzenia, że ​​można go użyć jako atrybutu. Państwo może również użyć właściwości DOM.
Oli
4

Jeśli masz obiekt przycisku o nazwie b: b.disabled=false;

dplass
źródło
3

Myślę, że najlepszym sposobem może być:

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

Działa dobrze w różnych przeglądarkach.

Benito
źródło
4
powinno być prop, nie attr.
Antti Haapala
1
pytanie szuka natywnego rozwiązania js
behradkhodayar
0
<button disabled=true>text here</button>

Nadal możesz użyć atrybutu. Wystarczy użyć atrybutu „disabled” zamiast „value”.

anonimowy
źródło
To jest disabled="disabled"po prostu disabled. Każda wartość ciągu jest równoważna "disabled", w tym disabled="true"i disabled="false".
user4642212,