Wie deaktiviere ich die HTML-Schaltfläche mit JavaScript?

185

Ich habe gelesen, dass Sie eine HTML-Schaltfläche deaktivieren (physisch nicht anklickbar machen) können, indem Sie sie einfach disablewie folgt an ihr Tag anhängen , jedoch nicht als Attribut:

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

Da diese Einstellung kein Attribut ist, wie kann ich sie dynamisch über JavaScript hinzufügen, um eine zuvor aktivierte Schaltfläche zu deaktivieren?

Jack Roscoe
quelle

Antworten:

273

Da diese Einstellung kein Attribut ist

Es ist ein Attribut.

Einige Attribute sind als boolesch definiert, dh Sie können ihren Wert angeben und alles andere weglassen. dh anstelle von disabled = " disabled " fügen Sie nur den fett gedruckten Teil ein. In HTML 4, Sie sollten nur den fettgedruckten Teil enthalten , wie die Vollversion als markiert ist ein Feature mit begrenzten Unterstützung (auch wenn das weniger wahr ist jetzt dann , wenn die Spezifikation geschrieben wurde).

Ab HTML 5 haben sich die Regeln geändert und jetzt geben Sie nur den Namen und nicht den Wert an. Dies macht praktisch keinen Unterschied, da der Name und der Wert gleich sind.

Die DOM-Eigenschaft wird auch aufgerufen disabledund ist ein Boolescher Wert, der trueoder annimmt false.

foo.disabled = true;

Theoretisch können Sie auch foo.setAttribute('disabled', 'disabled');und foo.removeAttribute("disabled"), aber ich würde dies nicht mit älteren Versionen von Internet Explorer vertrauen (die notorisch fehlerhaft sind, wenn es darum geht setAttribute).

QUentin
quelle
Wäre es sinnvoll, beides zu tun, die Eigenschaft zu ändern und das Attribut festzulegen, oder ist es nur ein Overkill?
v010dya
Was ist fooin foo.disabled = true;? Ist es die ID dieser Schaltfläche?
Stapel
@stack - Eine Variable, die einen Verweis auf das Element enthält, das mit beliebigen Mitteln gesammelt wurde (z. B. querySelector)
Quentin
145

Etwas deaktivieren

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

ermöglichen

document.getElementById("btnPlaceOrder").disabled = false; 
Kaushar
quelle
3
Aus irgendeinem Grund hat das bei mir $('#btnPlaceOrder').disabled = false;funktioniert, obwohl es nicht funktioniert.
Levininja
4
Ich habe $('#btnPlaceOrder')[0].disabled = falseals jquery-Selektor ein Array zurückgegeben. Zucken.
Chilly
6
jquery! == Javascript. jquery gibt einen Array-ähnlichen Selektor zurück.
AnilRedshift
@levininja, Chilly - $ ('# btnPlaceOrder'). prop ('disabled', false);
Dominik Späte
22

Es ist ein Attribut, aber ein boolesches (es braucht also keinen Namen, nur einen Wert - ich weiß, es ist komisch). Sie können das Eigenschaftsäquivalent in Javascript festlegen:

document.getElementsByName("myButton")[0].disabled = true;
Andy E.
quelle
2
Es braucht einen Wert, es ist der Name, den es nicht braucht. (Komisch aber wahr).
Quentin
1
@ David: Ich erinnere mich, dass ich das schon einmal gelesen habe, behoben. Es ist in der Tat seltsam und würde wahrscheinlich mehr Sinn machen, wenn Syntax-Textmarker es richtig honorierten :-)
Andy E
10

Versuche Folgendes:

document.getElementById("id").setAttribute("disabled", "disabled");
Maksim Kondratyuk
quelle
4
Wie David Dorward erwähnte , kann dies nicht als ordnungsgemäß browserübergreifend angesehen werden, und stattdessen sollte das Eigenschaftsäquivalent verwendet werden.
Andy E
9

Der offizielle Weg, um das disabledAttribut auf ein zu setzen, HTMLInputElementist folgender:

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

Während @ kaushar Antwort zum Aktivieren und Deaktivieren eine ausreichend ist HTMLInputElement, und ist wahrscheinlich vorzuziehen , für die Kompatibilität Cross-Browser aufgrund IE ist historisch Buggy setAttribute, es funktioniert nur , weil ElementEigenschaften Schatten ElementAttribute. Wenn eine Eigenschaft festgelegt ist, verwendet das DOM standardmäßig den Wert der Eigenschaft anstelle des Werts des entsprechenden Attributs.

Es gibt einen sehr wichtigen Unterschied zwischen Eigenschaften und Attributen. Ein Beispiel für eine echte HTMLInputElement Eigenschaft ist input.value, und im Folgenden wird gezeigt, wie das Abschatten funktioniert:

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

Das bedeutet, dass Eigenschaften Schattenattribute sind. Dieses Konzept gilt auch für geerbte Eigenschaften in der prototypeKette:

Ich hoffe, dies klärt Verwirrung über den Unterschied zwischen Eigenschaften und Attributen.

Patrick Roberts
quelle
5

Es ist immer noch ein Attribut. Einstellen auf:

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

... ist gültig.

Oli
quelle
1
Gültig, aber die Spezifikation besagt, dass Syntax vermieden werden sollte: w3.org/TR/html4/appendix/notes.html#hB.3.3
Quentin
2
Alle Browser suchen nach deaktiviert = "deaktiviert", ich weiß, dass die Spezifikation sagt, um dies zu vermeiden, aber ich hatte nie Probleme, die Einstellung deaktiviert = "deaktiviert" oder aktiviert = "überprüft" oder ausgewählt = "ausgewählt" zu haben. t do disabled = "true" ... nur einige Browser werden das erkennen
Bob Fincheimer
Natürlich unterstützen es nicht alle Browser - die Spezifikation wäre nicht so explizit, wenn sie es nicht wäre. Sie sind einfach nicht mehr gebräuchlich.
Quentin
1
Übrigens lautet die Frage "Wie kann ich dies dynamisch über JavaScript hinzufügen?"
Quentin
Sicher, aber die Frage geht weiter darüber, dass Behinderte kein Attribut sind. In meiner Antwort geht es darum, das zu zerstreuen und zu sagen, dass Sie es als Attribut verwenden können. Sie können auch die DOM-Eigenschaft verwenden.
Oli
4

Wenn Sie das Schaltflächenobjekt mit dem Namen b haben: b.disabled=false;

dplass
quelle
3

Ich denke, der beste Weg könnte sein:

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

Es funktioniert gut Cross-Browser.

Benito
quelle
4
es sollte propnicht sein attr.
Antti Haapala
Frage sucht nach nativen js Lösung
NDFA
0
<button disabled=true>text here</button>

Sie können weiterhin ein Attribut verwenden. Verwenden Sie einfach das Attribut 'disabled' anstelle von 'value'.

anonym
quelle
Es ist disabled="disabled"oder nur disabled. Jeder Zeichenfolgenwert entspricht "disabled", einschließlich disabled="true"und disabled="false".
user4642212