Ist das wirklich ein jQuery-Problem? Oder funktioniert Dropdown mit schreibgeschütztem Attribut einfach nicht?
Ilia G
Kanishka Panamaldeniya hat Ihnen bereits die richtige Antwort gegeben (sollte eine Antwort anstelle eines Kommentars sein).
Qbantek
2
Dropdown ist nicht immer schreibgeschützt. Schreibgeschützt bedeutet, dass Sie den Wert sehen, aber nicht ändern können.
Suncat2000
Antworten:
182
$('#cf_1268591').attr("disabled",true);
Dropdown ist immer schreibgeschützt. Sie können es deaktivieren
Wenn Sie mit einem Formular arbeiten, werden die deaktivierten Felder nicht gesendet. Verwenden Sie daher ein verstecktes Feld, um den deaktivierten Dropdown-Wert zu speichern
Wenn Sie ein Dropdown deaktivieren, wird es nicht gesendet. Ich werde Ihre Lösung versuchen.
Karim Ali
3
Ein Problem beim Deaktivieren einer Auswahl (Dropdown-Liste) besteht darin, dass in einigen Browsern (z. B. IE9) der Fokus verloren geht. Dies kann ein Problem sein, wenn das Auswahlelement deaktiviert wird, während ein Ajax-Aufruf verarbeitet wird, z. B. weil die Position des Benutzers im Formular verloren geht.
Chris
1
Danke für Ihren Vorschlag. Nur eine Frage; Wie würde ich den Dropdown-Wert in einem versteckten Feld speichern? Hätten Sie einen Beispielcode dafür?
kramer65
2
Eine weitere "Problemumgehung" besteht darin, diese Felder vor dem Absenden des Formulars zu aktivieren. Oder in meinem Fall, in dem ich die Daten im JSON-Format gesendet habe (aktivieren, Daten abrufen, erneut deaktivieren): var disabled = $ (yourform) .find (': input: disabled'). RemoveAttr ('disabled'); var data = getFormJSONData ($ (yourform)); disabled.attr ('disabled', 'disabled');
KDT
4
Sie sollten prop()jetzt verwenden.
alex
143
Ich hatte das gleiche Problem. Meine Lösung bestand darin, alle nicht ausgewählten Optionen zu deaktivieren. Sehr einfach mit jQuery:
$('option:not(:selected)').attr('disabled',true);
Bearbeiten =>
Wenn Sie mehrere Dropdowns auf derselben Seite haben, deaktivieren Sie alle nicht ausgewählten Optionen in der Auswahl-ID wie folgt.
Großartige Idee! Um Best Practices mit aktuellen Versionen von jQuery zu verwenden, würde ich die prop-Methode verwenden, um den deaktivierten Wert festzulegen. dh$('option:not(:selected)').prop('disabled', true);
Chris O'Connell
Dies ist eine sehr witzige Lösung!
Jacques
1
JA! großartige Idee.
Eric
1
Dies sollte die Antwort Nr. 1 sein.
Erwan Clügairtz
22
Versuchen Sie dies .. ohne den ausgewählten Wert zu deaktivieren ..
<scriptsrc="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><ahref="#">Click here to enable readonly</a><select><option>Example 1</option><optionselected>Example 2</option><option>Example 3</option></select>
Sehr cooler Ansatz, aber der Benutzer kann weiterhin TAB auf der Tastatur verwenden, um einen Wert auszuwählen.
Ricardo Martins
1
@ RicardoMartins danke, aktualisierte die Antwort, um Änderungen mit TAB zu verhindern
Lucas Bustamante
11
Ich würde das Feld deaktivieren. Wenn das Formular gesendet wird, deaktivieren Sie es nicht. Meiner Meinung nach ist dies einfacher, als mit versteckten Feldern umgehen zu müssen.
//disable the field
$("#myFieldID").prop("disabled",true);//right before the form submits, we re-enable the fields, to make them submit.
$("#myFormID").submit(function(event){
$("#myFieldID").prop("disabled",false);});
Toller (winziger) Codeausschnitt, danke. Dropdown-Listen werden deaktiviert, sodass sie nicht geändert werden können, ihre Werte jedoch weiterhin übermittelt werden können. Sehr hilfreich.
Alex Hopkins
3
Diese Zeile wählt mit dem readonlyAttribut schreibgeschützt aus:
Dieser Code speichert zuerst die ursprüngliche Auswahl in jeder Dropdown-Liste. Wenn der Benutzer die Auswahl ändert, wird die Dropdown-Liste auf die ursprüngliche Auswahl zurückgesetzt.
//store the original selection
$("select :selected").each(function(){
$(this).parent().data("default",this);});//change the selction back to the original
$("select").change(function(e){
$($(this).data("default")).prop("selected",true);});
Es ist ein alter Artikel, aber ich möchte Leute warnen, die ihn finden werden. Seien Sie vorsichtig mit deaktivierten Attributen mit got Element nach Namen. Seltsam, aber es scheint nicht zu funktionieren.
Ja, ich weiß, dass ich besser prop und nicht attr verwenden sollte, aber zumindest funktioniert prop jetzt aufgrund der alten Version von jquery nicht, und jetzt kann ich es nicht aktualisieren. Fragen Sie nicht, warum ... HTML-Unterschied wird nur hinzugefügt id :. ..
Ich habe keine Fehler im Skript gefunden, und in der Version mit Namen gab es keine Fehler in der Konsole. Aber natürlich kann es mein Fehler im Code sein
Ich habe festgestellt, dass ein besserer Weg, dies zu tun, darin besteht, Zeigerereignisse mithilfe von CSS zu entfernen und die Deckkraft in der Dropdown-Liste zu ändern (versuchen Sie es mit 0,5). Dies gibt dem Benutzer den Eindruck, dass es wie gewohnt deaktiviert ist, aber dennoch Daten veröffentlicht.
Zugegeben, dies hat einige Probleme mit der Abwärtskompatibilität, ist aber meiner Meinung nach eine bessere Option, als das lästige Problem mit deaktivierten / schreibgeschützten Objekten zu umgehen.
nicht gut, wenn die aktuell ausgewählte Option nicht an erster Stelle in der Liste steht, wie in diesem Beispiel: jsfiddle.net/4aHcD/19
Homer
@Homer, der Code soll ihn nach jeder Änderung zurücksetzen, und er funktioniert in diesem Effekt. Wenn Sie es zunächst anstelle der Änderung der Ausgangswert sich aus irgendeinem Grund laufen lassen wollen, können Sie immer das Änderungsereignis auf Ihrem Element aufrufen , nachdem das Ereignis zu erklären, mit $("select").change(), wie so jsfiddle.net/4aHcD/20
Alex Turpin
2
Wenn die Seite zum ersten Mal geladen wird, wenn das dritte Element ausgewählt ist und der Benutzer versucht, es in das zweite Element zu ändern, ändert Ihr Code die Auswahl in das erste Element. Ich denke nicht, dass es das nicht tun sollte. Hier ist ein Beispiel für das, was das OP meiner Meinung nach wollte, ein Dropdown-Menü, das seinen ausgewählten Wert basierend auf der Benutzerinteraktion nicht ändert: jsfiddle.net/4aHcD/22
Homer
Was ich brauche und was das OP anfordert, ist eine Möglichkeit , es schreibgeschützt zu machen . Das heißt, Sie können den oder die ausgewählten Werte sehen, aber nicht ändern. Das bedeutet, dass die Anzeige das Erscheinungsbild des bearbeitbaren Steuerelements nachahmt, ohne es bearbeiten zu können.
Suncat2000
0
Versuchen Sie, eine leere Zeichenfolge zu erstellen, wenn Sie die Taste drücken.
Hier ist eine geringfügige Abweichung von den anderen Antworten, die die Verwendung von deaktiviert vorschlagen. Da das Attribut "disabled" tatsächlich einen beliebigen Wert haben und dennoch deaktiviert werden kann, können Sie es auf "readonly" setzen, wie "disabled =" readonly ". Dadurch wird das Steuerelement wie gewohnt deaktiviert und Sie können es mit CSS wie folgt einfach anders formatieren als mit normalen deaktivierten Steuerelementen:
select[disabled=readonly]{.... styles you like for read-only
}
Wenn Sie möchten, dass Daten gesendet werden, verwenden Sie ausgeblendete Felder oder aktivieren Sie sie vor dem Senden, wie in den anderen Antworten beschrieben.
Wie @Kanishka sagte, wenn wir ein Formularelement deaktivieren, wird es nicht gesendet. Ich habe ein Snippet für dieses Problem erstellt. Wenn das Auswahlelement deaktiviert ist, wird ein ausgeblendetes Eingabefeld erstellt und der Wert gespeichert. Wenn es aktiviert ist, werden die erstellten ausgeblendeten Eingabefelder gelöscht.
jQuery(document).ready(function($){var $dropDown = $('#my-select'),
name = $dropDown.prop('name'),
$form = $dropDown.parent('form');
$dropDown.data('original-name', name);//store the name in the data attribute
$('#toggle').on('click',function(event){if($dropDown.is('.disabled')){//enable it
$form.find('input[type="hidden"][name='+ name +']').remove();// remove the hidden fields if any
$dropDown.removeClass('disabled')//remove disable class .prop({
name: name,
disabled:false});//restore the name and enable }else{//disable it var $hiddenInput = $('<input/>',{
type:'hidden',
name: name,
value: $dropDown.val()});
$form.append($hiddenInput);//append the hidden field with same name and value from the dropdown field
$dropDown.addClass('disabled')//disable class.prop({'name': name +"_1",
disabled:true});//change name and disbale }});});
Antworten:
Dropdown ist immer schreibgeschützt. Sie können es deaktivieren
Wenn Sie mit einem Formular arbeiten, werden die deaktivierten Felder nicht gesendet. Verwenden Sie daher ein verstecktes Feld, um den deaktivierten Dropdown-Wert zu speichern
quelle
prop()
jetzt verwenden.Ich hatte das gleiche Problem. Meine Lösung bestand darin, alle nicht ausgewählten Optionen zu deaktivieren. Sehr einfach mit jQuery:
Bearbeiten => Wenn Sie mehrere Dropdowns auf derselben Seite haben, deaktivieren Sie alle nicht ausgewählten Optionen in der Auswahl-ID wie folgt.
quelle
$('option:not(:selected)').prop('disabled', true);
Versuchen Sie dies .. ohne den ausgewählten Wert zu deaktivieren ..
Für mich geht das..
quelle
Das suchen Sie:
Klappt wunderbar.
quelle
tabindex="-1"
Wenn Sie ein Element mit
disabled
festlegen, werden die Daten nicht gesendet,select
Elemente jedoch nichtreadonly
.Sie können eine Simulation
readonly
auf derselect
Verwendung von CSS für das Styling und JS Wechsel mit Tab zu verhindern:Dann benutze es wie folgt:
Ergebnis:
Code-Snippet anzeigen
quelle
Ich würde das Feld deaktivieren. Wenn das Formular gesendet wird, deaktivieren Sie es nicht. Meiner Meinung nach ist dies einfacher, als mit versteckten Feldern umgehen zu müssen.
quelle
Einfache Abfrage zum Entfernen nicht ausgewählter Optionen.
quelle
Zur Vereinfachung gibt es hier ein jQuery-Plugin, das dies ohne Probleme erledigt: https://github.com/haggen/readonly
quelle
Diese Zeile wählt mit dem
readonly
Attribut schreibgeschützt aus:quelle
Dieser Code speichert zuerst die ursprüngliche Auswahl in jeder Dropdown-Liste. Wenn der Benutzer die Auswahl ändert, wird die Dropdown-Liste auf die ursprüngliche Auswahl zurückgesetzt.
http://jsfiddle.net/4aHcD/22/
quelle
Die einfachste Option für mich war, die Auswahl als schreibgeschützt zu treffen und Folgendes hinzuzufügen:
Sie müssen keine zusätzliche Logik schreiben. Keine versteckten Eingaben oder deaktiviert und dann beim Senden des Formulars wieder aktiviert.
quelle
Es ist ein alter Artikel, aber ich möchte Leute warnen, die ihn finden werden. Seien Sie vorsichtig mit deaktivierten Attributen mit got Element nach Namen. Seltsam, aber es scheint nicht zu funktionieren.
das funktioniert nicht:
diese Arbeit:
Ja, ich weiß, dass ich besser prop und nicht attr verwenden sollte, aber zumindest funktioniert prop jetzt aufgrund der alten Version von jquery nicht, und jetzt kann ich es nicht aktualisieren. Fragen Sie nicht, warum ... HTML-Unterschied wird nur hinzugefügt id :. ..
...
Ich habe keine Fehler im Skript gefunden, und in der Version mit Namen gab es keine Fehler in der Konsole. Aber natürlich kann es mein Fehler im Code sein
Gesehen auf: Chrome 26 unter Win 7 Pro
Entschuldigung für die schlechte Grammatik.
quelle
Ich habe festgestellt, dass ein besserer Weg, dies zu tun, darin besteht, Zeigerereignisse mithilfe von CSS zu entfernen und die Deckkraft in der Dropdown-Liste zu ändern (versuchen Sie es mit 0,5). Dies gibt dem Benutzer den Eindruck, dass es wie gewohnt deaktiviert ist, aber dennoch Daten veröffentlicht.
Zugegeben, dies hat einige Probleme mit der Abwärtskompatibilität, ist aber meiner Meinung nach eine bessere Option, als das lästige Problem mit deaktivierten / schreibgeschützten Objekten zu umgehen.
quelle
Sie können es auch deaktivieren und in dem Moment, in dem Sie den Übermittlungsaufruf ausführen, aktivieren. Ich denke ist der einfachste Weg :)
quelle
Es funktioniert sehr gut
Damit kann ich die Optionen sehen, aber ich kann sie nicht auswählen
quelle
Es gibt kein schreibgeschütztes Dropdown-Menü. Sie können es nach jeder Änderung manuell auf den ersten Wert zurücksetzen.
http://jsfiddle.net/4aHcD/
quelle
$("select").change()
, wie so jsfiddle.net/4aHcD/20Versuchen Sie, eine leere Zeichenfolge zu erstellen, wenn Sie die Taste drücken.
Das HTML ist:
Die Frage ist:
// mache nach keyup mit leerer string
quelle
Vielleicht können Sie es so versuchen
Dies setzt den ersten Wert des Dropdowns als Standard und scheint schreibgeschützt zu sein
quelle
HTML5-Unterstützung:
`
quelle
Hier ist eine geringfügige Abweichung von den anderen Antworten, die die Verwendung von deaktiviert vorschlagen. Da das Attribut "disabled" tatsächlich einen beliebigen Wert haben und dennoch deaktiviert werden kann, können Sie es auf "readonly" setzen, wie "disabled =" readonly ". Dadurch wird das Steuerelement wie gewohnt deaktiviert und Sie können es mit CSS wie folgt einfach anders formatieren als mit normalen deaktivierten Steuerelementen:
Wenn Sie möchten, dass Daten gesendet werden, verwenden Sie ausgeblendete Felder oder aktivieren Sie sie vor dem Senden, wie in den anderen Antworten beschrieben.
quelle
Wie @Kanishka sagte, wenn wir ein Formularelement deaktivieren, wird es nicht gesendet. Ich habe ein Snippet für dieses Problem erstellt. Wenn das Auswahlelement deaktiviert ist, wird ein ausgeblendetes Eingabefeld erstellt und der Wert gespeichert. Wenn es aktiviert ist, werden die erstellten ausgeblendeten Eingabefelder gelöscht.
Mehr Info
quelle