Wie erstelle ich ein Dropdown schreibgeschützt mit jquery?

91

Ich verwende die folgende Anweisung, um sie schreibgeschützt zu machen, aber sie funktioniert nicht.

$('#cf_1268591').attr("readonly", "readonly"); 

Ich möchte es nicht deaktivieren, ich möchte es schreibgeschützt machen.

Karim Ali
quelle
4
Was wäre der Unterschied zwischen einem schreibgeschützten Dropdown und einem Standard-Dropdown?
Leo
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

Kanishka Panamaldeniya
quelle
26
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.

$('#select_field_id option:not(:selected)').attr('disabled', true);
Bertrand D.
quelle
24
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 ..

$('#cf_1268591 option:not(:selected)').prop('disabled', true);

Für mich geht das..

Prabhagaran
quelle
Entsprechend Ihrer Antwort habe ich die anderen Optionen $ ('# cf_1268591 option: not (: selected)') entfernt. Remove ();
Seth Winters
20

Das suchen Sie:

$('#cf_1268591').attr("style", "pointer-events: none;");

Klappt wunderbar.

Mainak Chakraborty
quelle
1
Tolle Antwort, aber Vorsicht, dies ermöglicht es der Auswahl immer noch, Registerkarten zu erstellen. Sie müssen auch dietabindex="-1"
uesports135
Großer Mann, ich brauche das, da deaktiviert nicht dem Modell zugeordnet ist, danke für Ihre Antwort.
Sina_Islam
13

Wenn Sie ein Element mit disabledfestlegen, werden die Daten nicht gesendet, selectElemente jedoch nicht readonly.

Sie können eine Simulation readonlyauf der selectVerwendung von CSS für das Styling und JS Wechsel mit Tab zu verhindern:

select[readonly] {
  background: #eee;
  pointer-events: none;
  touch-action: none;
}

Dann benutze es wie folgt:

var readonly_select = $('select');
$(readonly_select).attr('readonly', true).attr('data-original-value', $(readonly_select).val()).on('change', function(i) {
    $(i.target).val($(this).attr('data-original-value'));
});

Ergebnis:

Lucas Bustamante
quelle
2
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 );
});     
NL3294
quelle
8

Einfache Abfrage zum Entfernen nicht ausgewählter Optionen.

$('#your_dropdown_id option:not(:selected)').remove();
abhi chavda
quelle
Auch meine Lösung. Besser als sie deaktivieren.
Gianluca Demarinis
6

Zur Vereinfachung gibt es hier ein jQuery-Plugin, das dies ohne Probleme erledigt: https://github.com/haggen/readonly

Arthur Corenzan
quelle
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:

$('select[readonly=readonly] option:not(:selected)').prop('disabled', true);
bewundernhodzic
quelle
2

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/

//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);
});
Homer
quelle
2

Die einfachste Option für mich war, die Auswahl als schreibgeschützt zu treffen und Folgendes hinzuzufügen:

onmousedown="return false" onkeydown="return false"

Sie müssen keine zusätzliche Logik schreiben. Keine versteckten Eingaben oder deaktiviert und dann beim Senden des Formulars wieder aktiviert.

Awais Tariq
quelle
1

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:

<script language="JavaScript">
function onChangeFullpageCheckbox() {    
$('name=img_size').attr("disabled",$("#fullpage").attr("checked"));
</script>

diese Arbeit:

<script language="JavaScript">
function onChangeFullpageCheckbox() {    
$('#img_size').attr("disabled",$("#fullpage").attr("checked"));
</script>

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

<select name="img_size" class="dropDown" id="img_size">
<option value="200">200px
</option><option value="300">300px
</option><option value="400">400px
</option><option value="500">500px
</option><option value="600" selected="">600px
</option><option value="800">800px
</option><option value="900">900px
</option><option value="1024">1024px
</option></select>

<input type="checkbox" name="fullpage" id="fullpage" onChange="onChangeFullpageCheckbox()" />

...

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.

Andrej
quelle
1

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.

user3427526
quelle
Können Sie das dafür erforderliche CSS näher erläutern?
Cocowalla
1

Sie können es auch deaktivieren und in dem Moment, in dem Sie den Übermittlungsaufruf ausführen, aktivieren. Ich denke ist der einfachste Weg :)

Hictus
quelle
1

Es funktioniert sehr gut

$('#cf_1268591 option:not(:selected)').prop('disabled', true);

Damit kann ich die Optionen sehen, aber ich kann sie nicht auswählen

Ricardo Mendes
quelle
0

Es gibt kein schreibgeschütztes Dropdown-Menü. Sie können es nach jeder Änderung manuell auf den ersten Wert zurücksetzen.

$("select").change(function(event) {
    $(this).val($(this).find("option").first().val());
});

http://jsfiddle.net/4aHcD/

Alex Turpin
quelle
3
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.

Das HTML ist:

<input id="cf_1268591" style="width:60px;line-height:16px;border:1px solid #ccc">

Die Frage ist:

$("#cf_1268591").combobox({
  url:"your url",
  valueField:"id",
  textField:"text",
  panelWidth: "350",
  panelHeight: "200",
});

// mache nach keyup mit leerer string

var tb = $("#cf_1268591").combobox("textbox");
  tb.bind("keyup",function(e){
  this.value = "";
});
Hendro
quelle
0

Vielleicht können Sie es so versuchen

function myFunction()
{
   $("select[id^=myID]").attr("disabled", true);
   var txtSelect = $("select[id^=myID] option[selected]").text();
}

Dies setzt den ersten Wert des Dropdowns als Standard und scheint schreibgeschützt zu sein

Monicalh
quelle
0

HTML5-Unterstützung:

`
     $("#cCity").attr("disabled", "disabled"); 
     $("#cCity").addClass('not-allow');

`

Atul Kumar
quelle
0

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.

DaveInMaine
quelle
0

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

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 
    }
  });
});
/*Optional*/

select.disabled {
  color: graytext;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<form action="#" name="my-form">
  <select id="my-select" name="alpha">
    <option value="A">A</option>
    <option value="B">B</option>
    <option value="C">C</option>
  </select>
</form>
<br/>
<button id="toggle">toggle enable/disable</button>

Amiya
quelle