Gemäß den HTML-Spezifikationen hat das select
Tag in HTML kein readonly
Attribut, sondern nur ein disabled
Attribut. Wenn Sie also verhindern möchten, dass der Benutzer das Dropdown-Menü ändert, müssen Sie verwenden disabled
.
Das einzige Problem ist, dass deaktivierte HTML-Formulareingaben nicht in die POST / GET-Daten aufgenommen werden.
Was ist der beste Weg, um das readonly
Attribut für ein select
Tag zu emulieren und trotzdem die POST-Daten abzurufen?
javascript
html
Jrgns
quelle
quelle
Antworten:
Sie sollten das
select
Element beibehalten,disabled
aber auch ein weiteres Elementinput
mit demselben Namen und Wert hinzufügen .Wenn Sie SELECT wieder aktivieren, sollten Sie seinen Wert in die On-Hidden-Eingabe eines Onchange-Ereignisses kopieren und die Hidden-Eingabe deaktivieren (oder entfernen).
Hier ist eine Demo:
quelle
selected
Wert zurückgesendet, nicht die gesamte Liste. Ihrhidden
sitzt also vor Ihremselect
und hält den ausgewählten Wert. Wenn die Auswahl für "schreibgeschützt" deaktiviert wird, enthält der Beitrag zurück nur den Wert der versteckten Eingabe. Wenn die Auswahl aktiviert ist, wird der verborgene Wert durch die sichtbare ausgewählte Option "überschrieben / ersetzt", und dies ist der Wert, der zurückgesendet wird.Wir könnten das auch nutzen
Deaktivieren Sie alle außer der ausgewählten Option:
Auf diese Weise funktioniert das Dropdown-Menü weiterhin (und übermittelt seinen Wert), der Benutzer kann jedoch keinen anderen Wert auswählen.
Demo
quelle
option
Tag-disabled
Attribut$("#yourSelectId option:not(:selected)).attr("disabled", "disabled")
Sie können das ausgewählte Objekt beim Senden wieder aktivieren.
BEARBEITEN : dh normalerweise das Auswahl-Tag (mit dem deaktivierten Attribut) deaktivieren und dann kurz vor dem Absenden des Formulars automatisch wieder aktivieren:
Beispiel mit jQuery:
So deaktivieren Sie es:
So aktivieren Sie es vor der Übermittlung erneut, damit GET / POST-Daten enthalten sind:
Darüber hinaus können Sie jeden deaktivierten Eingang wieder aktivieren oder Folgendes auswählen:
quelle
Eine andere Möglichkeit
readOnly
, einemselect
Element ein Attribut zuzuweisen, ist die Verwendung voncss
Sie könnten mögen:
DEMO
quelle
... .on('mouseover', function(){ ... });
pointer-events: none
verhindert den Fokus vom Mauszeiger. Um auch den Fokus von der Tastatur zu verhindern, können Sie ihn ergänzen, indem Sie alle$('select').css('pointer-events', 'none').on('focus', function () {$(this).blur();});
Getestet und funktionsfähig in IE 6, 7 & 8b2, Firefox 2 & 3, Opera 9.62, Safari 3.2.1 für Windows und Google Chrome.
quelle
<select id="countries"> <option value="7" selected="selected">Country7</option> </select>
onchange = 'this.selectedIndex=this.defaultIndex; alert("You should not change this..");'
anstatt nur den ausgewählten Index stillschweigend zu ändern.not-allowed
und die Hintergrundfarbe auf#CCC
.Einfache jQuery-Lösung
Verwenden Sie diese Option, wenn Ihre Auswahl die
readonly
Klasse hatOder dies, wenn Ihre Auswahl das
readonly="readonly"
Attribut hatquelle
$(document).ready(function(){$('select option:not(:selected)').attr('disabled',true);});
funktioniert gut mit Single Select. Es ist keine "schreibgeschützte" Klasse erforderlich. Mehrfachauswahl ist insofern problematisch, als wenn mehr als eine Option bereits ausgewählt und daher nicht deaktiviert ist und ein Benutzer eine der nicht deaktivierten Optionen auswählt, die anderen zuvor ausgewählten Optionen nicht ausgewählt werden.$select.find('option').not(':selected').attr('disabled', 'disabled');
select[readonly]
so ändern, dass Sie dem Element nur das schreibgeschützte Attribut hinzufügen - auf diese Weise müssen Sie Selects nicht anders behandeln als jeden anderen Typ. Das Javascript verstärkt dann schrittweise den Effekt. Beachten Sie, dass diese Lösung (und die meisten anderen) dem Benutzeragenten nur dabei hilft, die beste Benutzererfahrung zu bieten - sie erzwingt eigentlich nichts (dies muss bei Bedarf serverseitig erfolgen).Einfache CSS-Lösung:
Dies führt dazu, dass Select grau mit einem schönen Cursor "Deaktivieren" beim Hover ist
und bei Auswahl die Liste der Optionen "leer" ist, sodass Sie den Wert nicht ändern können.
quelle
Eine weitere zeitgemäßere Option (kein Wortspiel beabsichtigt) besteht darin, alle Optionen des ausgewählten Elements außer dem ausgewählten zu deaktivieren.
Beachten Sie jedoch, dass dies eine HTML 4.0-Funktion ist und 6,7,8 Beta 1 dies anscheinend nicht respektiert.
http://www.gtalbot.org/BrowserBugsSection/MSIE7Bugs/OptionDisabledSupport.html
quelle
Dies ist die beste Lösung, die ich gefunden habe:
Der obige Code deaktiviert alle anderen nicht ausgewählten Optionen, während die ausgewählte Option aktiviert bleibt. Wenn Sie dies tun, wird die ausgewählte Option in die Post-Back-Daten aufgenommen.
quelle
Ich weiß, dass es viel zu spät ist, aber es kann mit einfachem CSS gemacht werden:
Der Stil verbirgt alle Optionen und Gruppen, wenn sich die Auswahl im
readonly
Status befindet, sodass der Benutzer seine Auswahl nicht ändern kann.Es sind keine JavaScript-Hacks erforderlich.
quelle
Noch einfacher: Fügen Sie das Stilattribut zu Ihrem ausgewählten Tag hinzu:
quelle
Dies ist die einfachste und beste Lösung. Sie setzen einen Readolny-Attr auf Ihre Auswahl oder einen anderen Attr wie Daten-Readonly und führen die folgenden Schritte aus
quelle
Setzen Sie die Auswahl deaktiviert, wenn Sie planen, dass sie schreibgeschützt ist, und entfernen Sie dann das Attribut deaktiviert, bevor Sie das Formular senden.
quelle
Zusätzlich zum Deaktivieren der Optionen, die nicht auswählbar sein sollten, wollte ich sie tatsächlich aus der Liste verschwinden lassen, sie aber dennoch aktivieren können, falls ich sie später benötigen sollte:
Dadurch werden alle ausgewählten Elemente mit einem schreibgeschützten Attribut gefunden. Anschließend werden alle Optionen in den nicht ausgewählten Auswahlelementen gefunden. Anschließend werden sie ausgeblendet und deaktiviert.
Aus Leistungsgründen ist es wichtig, die jquery-Abfrage in 2 zu trennen, da jquery den Code von rechts nach links liest:
findet zuerst alle nicht ausgewählten Optionen im Dokument und filtert dann die darin enthaltenen Optionen mit einem schreibgeschützten Attribut.
quelle
.prop("disabled", true)
stattdessenEin einfacher serverseitiger Ansatz besteht darin, alle Optionen außer der Option zu entfernen, die Sie auswählen möchten. Wenn also in Zend Framework 1.12 $ element ein Zend_Form_Element_Select ist:
quelle
Wenn Sie ein Formularfeld deaktivieren, wird dieses beim Senden des Formulars nicht gesendet. Wenn Sie also eine benötigen
readonly
, die funktioniert,disabled
aber Werte sendet, gehen Sie wie folgt vor:Nach jeder Änderung der schreibgeschützten Eigenschaften eines Elements.
quelle
Lösung mit Tabindex. Funktioniert mit ausgewählten, aber auch Texteingaben.
Verwenden Sie einfach eine .disabled-Klasse.
CSS:
JS:
HTML:
Bearbeiten: Mit Internet Explorer benötigen Sie auch diese JS:
quelle
Nach dem Vorschlag von Grant Wagners; Hier ist ein jQuery-Snippet, das dies mit Handlerfunktionen anstelle von direkten onXXX-Attributen ausführt:
quelle
Ich habe es mit jquery gelöst:
quelle
Wenn Sie jquery validate verwenden, können Sie Folgendes tun: Ich habe das Attribut disabled ohne Probleme verwendet:
quelle
Was ich mit einfachem Javascript (dh keine JQuery-Bibliothek erforderlich) funktioniert, ist, das innerHTML des
<select>
Tags auf den gewünschten verbleibenden Wert zu ändern .Vor:
Beispiel Javascript:
Nach:
Auf diese Weise ändert sich kein visueller Effekt, und dies wird POST / GET innerhalb des
<FORM>
.quelle
Anstelle der Auswahl selbst können Sie alle Optionen außer der aktuell ausgewählten Option deaktivieren. Dadurch wird ein funktionierendes Dropdown-Menü angezeigt, aber nur die Option, die Sie übergeben möchten, ist eine gültige Auswahl.
quelle
HTML-Lösung:
Javascript:
zu entfernen:
Bearbeiten: Methoden zum Entfernen hinzugefügt
quelle
Entfernen Sie einfach das deaktivierte Attribut, bevor Sie das Formular senden.
quelle
disabled="disabled" ->
Sie erhalten Ihren Wert aus der Datenbank und zeigen ihn im Formular an.readonly="readonly" ->
Sie können Ihren Wert in der Auswahlbox ändern, aber Ihr Wert konnte nicht in Ihrer Datenbank gespeichert werden.quelle
Wenn die Auswahl-Dropdown-Liste seit der Geburt schreibgeschützt ist und sich überhaupt nicht ändern muss, sollten Sie stattdessen möglicherweise ein anderes Steuerelement verwenden. Wie ein einfaches
<div>
(plus verstecktes Formularfeld) oder ein<input type="text">
?Hinzugefügt: Wenn das Dropdown-Menü nicht immer schreibgeschützt ist und JavaScript zum Aktivieren / Deaktivieren verwendet wird, ist dies immer noch eine Lösung. Ändern Sie einfach das DOM im laufenden Betrieb.
quelle
Unten hat bei mir funktioniert:
quelle
Ich habe es geschafft, indem ich das Auswahlfeld ausgeblendet und
span
an seiner Stelle ein mit nur informativem Wert angezeigt habe. Wenn die.readonly
Klasse deaktiviert wird , müssen wir auch die.toVanish
Elemente entfernen und.toShow
diejenigen anzeigen.quelle
Im IE konnte ich den onfocus => onblur-Ansatz durch Doppelklick besiegen. Das Speichern des Werts und das anschließende Wiederherstellen im onchange-Ereignis scheint dieses Problem zu lösen.
Sie können ähnliche Aktionen ohne expando-Eigenschaften ausführen, indem Sie eine Javascript-Variable verwenden.
quelle
Hier ist ein Versuch, eine benutzerdefinierte jQuery-Funktion zu verwenden, um die Funktionalität zu erreichen (wie hier erwähnt):
quelle