Warum können Optionsfelder nicht "schreibgeschützt" sein?

213

Ich möchte ein Optionsfeld anzeigen, dessen Wert übermitteln lassen, aber je nach den Umständen nicht bearbeitbar haben. Deaktiviert funktioniert nicht, da der Wert nicht übermittelt wird (oder?) Und das Optionsfeld ausgegraut ist. Schreibgeschützt ist wirklich das, wonach ich suche, aber aus irgendeinem mysteriösen Grund funktioniert es nicht.

Gibt es einen seltsamen Trick, den ich ausführen muss, damit schreibgeschützt wie erwartet funktioniert? Sollte ich es stattdessen einfach in JavaScript tun?

Weiß übrigens jemand, warum schreibgeschützt in Optionsfeldern nicht funktioniert, während es in anderen Eingabe-Tags funktioniert? Ist dies eine dieser unverständlichen Auslassungen in den HTML-Spezifikationen?

mcv
quelle
5
"Ist dies eine dieser unverständlichen Auslassungen in den HTML-Spezifikationen?" Betrachten Sie es aus der Sicht eines Benutzers. Warum eine Schaltfläche anzeigen, auf die sie nicht klicken können?
Paul D. Waite
67
Warum eine Schaltfläche anzeigen, auf die sie nicht klicken können? Weil ich möchte, dass sie wissen, dass die Schaltfläche vorhanden ist, aber ich möchte nicht, dass sie jetzt darauf klicken können. Aber vielleicht später. Immerhin ist es eine dynamische Form. Warum sollte sich ein Optionsfeld von einem anderen Eingabefeld unterscheiden?
mcv
7
Hier ist die Spezifikation: w3.org/TR/html401/interact/forms.html#h-17.12.2 "Die folgenden Elemente unterstützen das schreibgeschützte Attribut: INPUT und TEXTAREA." Welches ist offensichtlich falsch. Zurück hier sehen wir jedoch eine genauere Zusammenfassung: w3.org/TR/WD-forms-970402#readonly "READONLY gilt für INPUT-Elemente vom Typ TEXT oder PASSWORD und für das TEXTAREA-Element." Sieht so aus, als wäre dies zwischen den Lücken von Recs und Spezifikationen gerutscht.
Graphicdivine
Noch neugieriger. In diesem alten Dokument heißt es: "In Kontrollkästchen können Sie sie beispielsweise aktivieren oder deaktivieren (wodurch der Status CHECKED festgelegt wird), aber Sie ändern den Wert des Felds nicht." ( htmlcodetutorial.com/forms/_INPUT_DISABLED.html ) Stimmt das? Sperrt die Einstellung READONLY für ein Kontrollkästchen / Radio den Wert, obwohl der Benutzer ihn anscheinend ändern kann?
Graphicdivine
Überprüfen Sie meinen Beitrag [hier] [1] gibt eine saubere einfache Lösung für das Problem [1]: stackoverflow.com/a/15513256/1861389
gefahren4ward

Antworten:

149

Ich habe schreibgeschützt ein Optionsfeld gefälscht, indem ich nur die nicht aktivierten Optionsfelder deaktiviert habe. Es verhindert, dass der Benutzer einen anderen Wert auswählt, und der aktivierte Wert wird immer beim Senden veröffentlicht.

Mit jQuery schreibgeschützt machen:

$(':radio:not(:checked)').attr('disabled', true);

Dieser Ansatz funktionierte auch, um eine Auswahlliste schreibgeschützt zu machen, außer dass Sie jede nicht ausgewählte Option deaktivieren müssen.

Megan
quelle
2
Danke @ Megan, das ist eine großartige Lösung
Michael La Voie
9
Eine Variation davon, damit Sie die readonlyEigenschaft nutzen können, wie das OP erwartet hatte:$(':radio[readonly]:not(:checked)').attr('disabled', true);
Wodow
1
Unter den folgenden Lösungen bietet diese Lösung den saubersten Code und funktioniert gut mit Jquery Validator, da ich keine Felder aktivieren / deaktivieren oder nicht bindende Klickereignisse behandeln und sie beim Senden des Formulars erneut binden muss.
Kristianne Nerona
Funktioniert genau. Danke
Hassan Farooq
Klug! Verwenden Sie .not (..), falls Sie bereits eine Reihe ausgewählter Eingabefelder haben: var myRadios = $ ('# spezifisch-radios'); myRadios.not (': checked'). prop ('disabled', true); api.jquery.com/not
JoePC
206

Optionsfelder müssen nur dann schreibgeschützt sein, wenn andere Optionen verfügbar sind. Wenn Sie keine anderen Optionen haben, kann ein aktiviertes Optionsfeld nicht deaktiviert werden. Wenn Sie andere Optionen haben, können Sie verhindern, dass der Benutzer den Wert ändert, indem Sie lediglich die anderen Optionen deaktivieren:

<input type="radio" name="foo" value="Y" checked>
<input type="radio" name="foo" value="N" disabled>

Geige: http://jsfiddle.net/qqVGu/

Sampson
quelle
3
Das Problem bei Ihrer ersten Lösung ist, dass ich plötzlich zwei Felder mit demselben Namen habe, wenn ich den Radiobutton über Javascript aktivieren möchte, sodass ich eines davon bereinigen muss. Oder verwenden Sie das versteckte Feld für real und lassen Sie das Optionsfeld nur den Wert des versteckten Felds einstellen. Äther, es ist nur ein bisschen umständlicher, als ich es mir für einen Radiobutton gewünscht hätte. Ihre zweite Lösung klingt, obwohl ich nicht bezweifle, dass sie funktioniert, wie ein wirklich hässlicher Hack. Ich denke, die Javascript-Lösung ist die einzige, die meine Kriterien erfüllt. Ich werde damit gehen.
mcv
7
Lösung 1 bitte! Es ist das einzig richtig zugängliche. Und wenn Sie ein Skript erstellen müssen, ist es nur noch eine Zeile, um die Aktiviertheit des ausgeblendeten Felds auf das Gegenteil der Aktiviertheit des Radios einzustellen.
Bobince
5
Ich habe gerade bemerkt, dass die Lösungen 2 und 3 in Jonathans Antwort die Plätze getauscht haben, daher scheinen die Kommentare jetzt nicht viel Sinn zu machen.
McV
1
Möchten Sie feststellen, dass die Javascript-Lösung nicht funktioniert, sondern nur die Schaltfläche deaktiviert. Ich nehme an, es muss sein onclick="return false", um Veränderungen zu verhindern.
dmitry
2
Wenn ich das Radio auf "deaktiviert" setze, füge ich "style = cursor: default" hinzu, um den "deaktivierten Cursor" zu entfernen.
Joao Paulo
24

Dies ist der Trick, mit dem Sie gehen können.

<input type="radio" name="name" onclick="this.checked = false;" />
Sarfraz
quelle
4
Genau das, was ich dachte, obwohl es am besten wäre, wenn Sie klarstellen würden, dass es onClick="this.checked = <%=value%>"von irgendeiner Art sein sollte :)
JustLoren
das ist toll zu wissen. Aktiviert kann entweder einen wahren oder einen falschen Wert haben.
Sarfraz
Nur eine Warnung, dass dies nicht für diejenigen von uns funktioniert, die mit Javascript surfen, das nicht standardmäßig aktiviert ist.
Tloach
3
Für meinen Fall kein Problem. Wir verwenden bereits Tonnen von jQuery und Ajax.
mcv
1
Bemerkenswert ist, dass Sie einfach tun können onclick="return false;", um den Wert für die Gruppe gleich zu halten
Zach
12

Ich habe ein langes Formular (mehr als 250 Felder), das in einer Datenbank veröffentlicht wird. Es ist eine Online-Bewerbung. Wenn sich ein Administrator einen eingereichten Antrag ansieht, wird das Formular mit Daten aus der Datenbank gefüllt. Eingabetexte und Textbereiche werden durch den von ihnen eingereichten Text ersetzt, aber die Radios und Kontrollkästchen sind nützlich, um sie als Formularelemente beizubehalten. Wenn Sie sie deaktivieren, sind sie schwerer zu lesen. Das Setzen der Eigenschaft .checked auf false onclick funktioniert nicht, da sie möglicherweise vom Benutzer überprüft wurden, der die App ausfüllt. Jedenfalls...

onclick="return false;"

funktioniert wie ein Zauber, um Radios und Kontrollkästchen ipso facto zu deaktivieren.

Humbolight
quelle
8

Die beste Lösung besteht darin, den aktivierten oder nicht aktivierten Status (entweder vom Client oder vom Server) festzulegen und den Benutzer nicht nach Stationen (dh schreibgeschützt) die folgenden Schritte ändern zu lassen:

<input type="radio" name="name" onclick="javascript: return false;" />
Vipresh
quelle
Nein! In diesem Fall kann der Benutzer HTML im Browser bearbeiten, die gewünschte Option als ausgewählt markieren und das Formular veröffentlichen.
error1009
2

Ich habe mir eine Javascript-schwere Methode ausgedacht, um einen schreibgeschützten Status für Kontrollkästchen und Optionsfelder zu erreichen. Es wird gegen aktuelle Versionen von Firefox, Opera, Safari, Google Chrome sowie gegen aktuelle und frühere Versionen von IE (bis auf IE7) getestet.

Warum nicht einfach die von Ihnen gewünschte Behindertenimmobilie nutzen? Beim Drucken der Seite werden deaktivierte Eingabeelemente in grauer Farbe angezeigt. Der Kunde, für den dies implementiert wurde, wollte, dass alle Elemente dieselbe Farbe haben.

Ich bin mir nicht sicher, ob ich den Quellcode hier posten darf, da ich ihn während meiner Arbeit für ein Unternehmen entwickelt habe, aber ich kann die Konzepte sicherlich teilen.

Bei Onmousedown-Ereignissen können Sie den Auswahlstatus lesen, bevor die Klickaktion ihn ändert. Sie speichern diese Informationen und stellen diese Zustände dann mit einem Onclick-Ereignis wieder her.

<input id="r1" type="radio" name="group1" value="r1" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);" checked="checked">Option 1</input>
<input id="r2" type="radio" name="group1" value="r2" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);">Option 2</input>
<input id="r3" type="radio" name="group1" value="r3" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);">Option 3</input>

<input id="c1" type="checkbox" name="group2" value="c1" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);" checked="checked">Option 1</input>
<input id="c2" type="checkbox" name="group2" value="c2" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);">Option 2</input>
<input id="c3" type="checkbox" name="group2" value="c3" onmousedown="storeSelectedRadiosForThisGroup(this.name);" onclick="setSelectedStateForEachElementOfThisGroup(this.name);" checked="checked">Option 3</input>

Der Javascript-Teil davon würde dann so funktionieren (wieder nur die Konzepte):

var selectionStore = new Object();  // keep the currently selected items' ids in a store

function storeSelectedRadiosForThisGroup(elementName) {
    // get all the elements for this group
    var radioOrSelectGroup = document.getElementsByName(elementName);

    // iterate over the group to find the selected values and store the selected ids in the selectionStore
    // ((radioOrSelectGroup[i].checked == true) tells you that)
    // remember checkbox groups can have multiple checked items, so you you might need an array for the ids
    ...
}

function setSelectedStateForEachElementOfThisGroup(elementName) {
    // iterate over the group and set the elements checked property to true/false, depending on whether their id is in the selectionStore
    ...

    // make sure you return false here
    return false;
}

Sie können jetzt die Optionsfelder / Kontrollkästchen aktivieren / deaktivieren, indem Sie die Eigenschaften onclick und onmousedown der Eingabeelemente ändern.

Tom
quelle
2

JavaScript-Methode - das hat bei mir funktioniert.

<script>
$(document).ready(function() {
   $('#YourTableId').find('*').each(function () { $(this).attr("disabled", true); });
});
</script>

Grund:

  1. $('#YourTableId').find('*') -> Dies gibt alle Tags zurück.

  2. $('#YourTableId').find('*').each(function () { $(this).attr("disabled", true); }); iteriert über alle darin erfassten Objekte und deaktiviert Eingabe-Tags.

Analyse (Debugging):

  1. form:radiobutton wird intern als "Eingabe" -Tag betrachtet.

  2. Wie in der obigen Funktion (), wenn Sie versuchen zu drucken document.write(this.tagName);

  3. Überall dort, wo in Tags Optionsfelder gefunden werden, wird ein Eingabe-Tag zurückgegeben.

Daher kann die obige Codezeile für Optionsfeld-Tags optimiert werden, indem * durch Eingabe ersetzt wird: $('#YourTableId').find('input').each(function () { $(this).attr("disabled", true); });

user3702798
quelle
1

Eine ziemlich einfache Option wäre, eine Javascript-Funktion zu erstellen, die beim "onsubmit" -Ereignis des Formulars aufgerufen wird, um den Radiobutton zurück zu aktivieren, sodass sein Wert mit dem Rest des Formulars veröffentlicht wird.
Es scheint keine Auslassung in HTML-Spezifikationen zu sein, aber eine Designauswahl (eine logische, IMHO), ein Radiobutton kann nicht schreibgeschützt sein, wie es eine Schaltfläche nicht sein kann, wenn Sie sie dann nicht verwenden möchten deaktiviere es.

Wintermute
quelle
1

Ich fand, dass die Verwendung onclick='this.checked = false;'bis zu einem gewissen Grad funktionierte. Ein Optionsfeld, auf das geklickt wurde, wurde nicht ausgewählt. Wenn jedoch ein Optionsfeld bereits ausgewählt war (z. B. ein Standardwert), wird dieses Optionsfeld nicht mehr ausgewählt.

<!-- didn't completely work -->
<input type="radio" name="r1" id="r1" value="N" checked="checked" onclick='this.checked = false;'>N</input>
<input type="radio" name="r1" id="r1" value="Y" onclick='this.checked = false;'>Y</input>

Wenn Sie in diesem Szenario den Standardwert in Ruhe lassen und die anderen Optionsfelder deaktivieren, wird das bereits ausgewählte Optionsfeld beibehalten und verhindert, dass es nicht ausgewählt wird.

<!-- preserves pre-selected value -->
<input type="radio" name="r1" id="r1" value="N" checked="checked">N</input>
<input type="radio" name="r1" id="r1" value="Y" disabled>Y</input>

Diese Lösung ist nicht die eleganteste Methode, um zu verhindern, dass der Standardwert geändert wird. Sie funktioniert jedoch unabhängig davon, ob Javascript aktiviert ist oder nicht.

JW8
quelle
1

Markieren Sie die nicht ausgewählten Optionsfelder als deaktiviert. Dies verhindert, dass sie auf Benutzereingaben reagieren und das aktivierte Optionsfeld löschen. Beispielsweise:

<input type="radio" name="var" checked="yes" value="Yes"></input>
<input type="radio" name="var" disabled="yes" value="No"></input>
dpolican
quelle
4
checked="yes"? Welche Spezifikation ist das? Verwenden Sie entweder checked="checked"oder nur das Attribut checkedohne Wert. Gleiches gilt für disabled.
Robin van Baalen
1

Probieren Sie das Attribut aus disabled, aber ich denke, Sie erhalten den Wert der Optionsfelder nicht. Oder stellen Sie stattdessen Bilder wie folgt ein:

<img src="itischecked.gif" alt="[x]" />radio button option

Freundliche Grüße.

Tim
quelle
1
Oh, mein HTML-Code wurde entfernt: img src = "itIsChecked.gif" alt = "[x]" OptionChecked
Tim
0

Ich verwende ein JS- Plugin , das Kontrollkästchen / Funkeingabeelemente formatiert und die folgende jQuery verwendet, um einen "schreibgeschützten Status" zu erstellen, in dem der zugrunde liegende Wert noch gebucht wird, das Eingabeelement jedoch für den Benutzer unzugänglich erscheint. Dies ist meines Erachtens der beabsichtigte Grund wir würden ein schreibgeschütztes Eingabeattribut verwenden ...

if ($(node).prop('readonly')) {
    $(node).parent('div').addClass('disabled'); // just styling, appears greyed out
    $(node).on('click', function (e) {
        e.preventDefault();
    });
}
Essstäbchen
quelle