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.


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


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);

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


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.


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:


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 );
});     

8

Einfache Abfrage zum Entfernen nicht ausgewählter Optionen.

$('#your_dropdown_id option:not(:selected)').remove();

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


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);

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);
});

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.


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.


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.


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


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


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/


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 = "";
});

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


0

HTML5-Unterstützung:

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

`


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.


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>

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.