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?

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


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; 

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;

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

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.


5

Es ist immer noch ein Attribut. Einstellen auf:

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

... ist gültig.


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;


3

Ich denke, der beste Weg könnte sein:

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

Es funktioniert gut Cross-Browser.


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


Es ist disabled="disabled"oder nur disabled. Jeder Zeichenfolgenwert entspricht "disabled", einschließlich disabled="true"und disabled="false".
user4642212
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.