Antworten auf deine Fragen:
Neues Thema erstellen

Input mit JS ausgrauen

Aelfry

Web Developer

Ich habe gerade folgendes Problem, bei dem ich fest stecke:
ich möchte durch Klicken einer Checkbox ein anderes Input ausgrauen und beim nächsten Klick wieder freigeben.
Mein Code dafür sieht so aus
HTML:
<script language="javascript">
function enable_disable() {
	if (document.getElementById('test_input').disabled == "true") {
		document.getElementById('test_input').disabled = "false";
	}
	else {
		document.getElementById('test_input').disabled = "true";
	}
}
</script>
</head>
<body>
<form>
    <input type="text" value="ausgrauen" id="test_input" />
    <p>ein/ausblenden vom Input <input type="checkbox" onchange="enable_disable()" /></p>
</form>
Beim ersten Klick wird das Input zwar ausgegraut, aber dannach bekomme ich es nicht mehr frei.
Sieht vielleicht jemand wo der Fehler liegt?
 

Duddle

Posting-Frequenz: 14µHz

AW: Input mit JS ausgrauen

Du benutzt Zeichenketten / Strings als Werte, obwohl du boolesche Werte brauchst.
Das disabled-Attribut als solches hat keinen Wert (nicht wie z.B. value), es ist nur ein Schalter und kann mit true oder false aktiviert/deaktiviert werden. Wenn du aber "true" oder "false" schreibst, wird das als String gesehen und er will disabled einen konkreten Wert zuweisen.

Lange Rede, kurzer Sinn:
Code:
function enable_disable() {
    if (document.getElementById('test_input').disabled == true) {
	document.getElementById('test_input').disabled = false;
    } else {
	document.getElementById('test_input').disabled = true;
    }
}


Duddle
 

mindraper

me[code].Java(Script)

AW: Input mit JS ausgrauen

hi

ich bin immer zu spät... ich kündige ;)

diese ergänzung ist etwas off-topic aber informativ

du könntest hier einige optimierungen angehen, je nach anforderungen/wünschen mehr oder weniger. ich liste sie mal anhand ihres kosten/nutzen verhältnisses geordnet auf, wobei diese unterscheidung teils aufgrund von allg. gründen beeinflusst wird.

1)
das textfeld das ausgegraut/-geschaltet werden soll nur einmal im DOM suchen. jedes durchwandern des DOMs kostet viel zeit (in javascript verhältnissen gesprochen und abhängig von der browser eigenen javascript-engine). zudem hat es den großen vorteil, dass dein code einfacher zu lesen ist - was im zweifelsfall ein "totschlag"-argument ist:

PHP:
function enable_disable () {
    var togglee = document.getElementById('test_input');
    if (togglee.disabled == true) {
        togglee.disabled = false;
    } else {
        togglee.disabled = true;
    }
}

2)
struktur und logik voneinander trennen. dazu dürftest du den "onchange"-listener:
HTML:
<input ... onchange="enable_disable()">

nicht mehr als eigenschaft des elements definieren. du setzt diesen dann innerhalb des javascript-codes bzw. lässt ihn von javascript setzen:
PHP:
document.body.onload = function () {
    var togglePairing = document.getElementsByTagName('input');

    togglePairing[1].onchange = function () {
        enable_disable(togglePairing[0]);
    }
}

alle weiteren änderungen bringen dir keine wirklichen verbesserungen in bezug auf performance. sie führen "nur" zu schöner zu lesendem code. es wäre also absolut in ordnung, an dieser stelle zu stoppen. :)



... oh, du liest weiter! :rot: :D

ok, ab jetzt beginnt ein prozess, der am ende dazu führt, dass dein code so ausschaut:

PHP:
document.body.onload = function () {
    var togglePairing = document.getElementsByTagName('input');
    
    togglePairing[1].onchange = enable_disable(togglePairing[0]);
}

3)
die function enable_disable könnte so umgebaut werden, dass sie ein übergebenes element ein-/ausschaltet. sie würde dann so ausschauen:

PHP:
function enable_disable (el) {
    if (el.disabled == true) {
        el.disabled = false;
    } else {
        el.disabled = true;
    }
}

der vorteil wäre, dass du mit dieser function theoretisch jedes element "an" und "aus" schalten könntest. :) zwar geht das nicht genau so wie sie jetzt implementiert ist, aber dazu komme ich gleich.

4)
um die lesbarkeit zu erhöhen, könnte das if-else-statement entfallen. du könntest dies tun, weil du eine eigenschaft einfach zwischen zwei gegensätzlichen zuständen wecheln lässt. vereinfacht gesagt: du schaltest eigentlich nur hin und her zwischen "an" und "aus":

PHP:
function enable_disable (el) {
    el.disabled = (el.disabled == true ? false : true);
}

oder noch kürzer:

PHP:
function enable_disable (el) {
    el.disabled = !el.disabled;
}

der erste fall innerhalb der klammern würde so übersetzt werden:
"wenn bedingung wahr ? dann : sonst"

während das ausrufezeichen im zweiten fall diese übersetzung hätte:
"gegenteil (von) diesem"

5)
wie in 3) gesagt, müsste man noch etwas tun, um das entgültige ergebnis zu bekommen und zu verhindern, dass das text-input feld sofort deaktiviert wird: die function enable_disable müsste ein function zurückgeben, die dann an den eventlistener gebunden ist. dazu muss enable_disable noch ein letztes mal modifiziert werden:

PHP:
function enable_disable (el) {
    return function () {
        el.disabled = !el.disabled;
    }
}

und zack! schon ist alles in butter :)

es ginge zwar noch etwas besser, aber das sprengt warscheinlich diesen post. stichworte währen und partial application.

gruß
 
Zuletzt bearbeitet:
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.616
Beiträge
1.538.359
Mitglieder
67.536
Neuestes Mitglied
QuestionMark
Oben