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?

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).


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; 

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;

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

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.


5

To wciąż atrybut. Ustawienie na:

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

... jest ważna.


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


3

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

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

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


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”.


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,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.