Jak utworzyć listę rozwijaną tylko do odczytu przy użyciu jQuery?


92

Używam następującego oświadczenia, aby uczynić go tylko do odczytu, ale nie działa.

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

Nie chcę, aby był wyłączony, chcę, aby był tylko do odczytu.


4
Jaka byłaby różnica między menu tylko do odczytu a standardowym menu rozwijanym?
Leo


Czy to naprawdę problem jQuery? A może lista rozwijana po prostu nie działa z atrybutem tylko do odczytu?
Ilia G

Kanishka Panamaldeniya już udzieliła poprawnej odpowiedzi (zamiast komentarza powinna dać odpowiedź).
qbantek

2
Lista rozwijana nie zawsze jest tylko do odczytu. Tylko do odczytu oznacza, że ​​możesz zobaczyć jego wartość, ale nie możesz jej zmienić.
Suncat2000

Odpowiedzi:


183
$('#cf_1268591').attr("disabled", true); 

lista rozwijana jest zawsze tylko do odczytu. co możesz zrobić, to wyłączyć

jeśli pracujesz z formularzem, wyłączone pola nie są przesyłane, więc użyj ukrytego pola do przechowywania wyłączonej wartości rozwijanej


28
Wyłączenie listy rozwijanej nie powoduje przesłania. Spróbuję twojego rozwiązania.
Karim Ali,

3
Jednym z problemów związanych z wyłączaniem wyboru (listy rozwijanej) jest utrata fokusu w niektórych przeglądarkach (np. IE9). Może to stanowić problem, jeśli element select jest wyłączany podczas przetwarzania wywołania Ajax, na przykład w przypadku utraty pozycji użytkownika w formularzu.
Chris,

1
Dzięki za Twoją sugestię. Tylko pytanie; jak przechowywać rozwijaną wartość w ukrytym polu? Miałbyś na to przykładowy kod?
kramer65

2
Innym „obejściem” byłoby włączenie tych pól przed przesłaniem formularza. Lub w moim przypadku, gdy wysłałem dane w formacie JSON (włącz, pobierz dane, wyłącz ponownie): var disabled = $ (yourform) .find (': input: disabled'). RemoveAttr ('disabled'); var data = getFormJSONData ($ (yourform)); disabled.attr ('disabled', 'disabled');
KDT

4
Powinieneś prop()teraz używać .
Alex

145

Miałem ten sam problem, moim rozwiązaniem było wyłączenie wszystkich niewybranych opcji. Bardzo proste z jQuery:

$('option:not(:selected)').attr('disabled', true);

Edit => Jeśli masz wiele list rozwijanych na tej samej stronie, wyłącz wszystkie niewybrane opcje na select-ID, jak poniżej.

$('#select_field_id option:not(:selected)').attr('disabled', true);

27
Świetny pomysł! Aby zastosować najlepsze praktyki z aktualnymi wersjami jQuery, użyłbym metody prop do ustawienia wartości wyłączonej. tj.$('option:not(:selected)').prop('disabled', true);
Chris O'Connell

To bardzo dowcipne rozwiązanie!
Jacques,

1
TAK! świetny pomysł.
Eric

1
To powinna być odpowiedź nr 1.
Erwan Clügairtz

22

Oto czego szukasz:

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

Działa jak marzenie.


2
Świetna odpowiedź, ale uważaj, to nadal pozwala na wybór karty. Musisz także ustawićtabindex="-1"
uesports135

Świetny człowieku, potrzebuję tego, ponieważ wyłączony, nie przypisany do modelu, dzięki za odpowiedź.
sina_Islam

22

Spróbuj tego ... bez wyłączania wybranej wartości.

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

Mi to pasuje..


W tym samym wierszu, co twoja odpowiedź, usunąłem pozostałe opcje $ ('# cf_1268591 opcja: not (: selected)'). Remove ();
Seth Winters

13

Wyłączyłbym pole. Następnie, gdy formularz zostanie przesłany, nie wyłączaj go. Moim zdaniem jest to łatwiejsze niż zajmowanie się ukrytymi polami.

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

13

Ustawienie elementu z disablednie spowoduje przesłania danych, jednak selectelementy nie mają readonly.

Można symulować readonlyna selectza pomocą CSS i JS do stylizacji, aby zapobiec zmianom w zakładce:

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

Następnie użyj go tak:

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

Wynik:


2
Bardzo fajne podejście, ale użytkownik nadal może używać klawisza TAB na klawiaturze do wybierania wartości.
Ricardo Martins

1
@RicardoMartins thanks, zaktualizowałem odpowiedź, aby zapobiec zmianom za pomocą TAB
Lucas Bustamante

8

Proste jquery, aby usunąć niewybrane opcje.

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

Również moje rozwiązanie. Lepiej niż unieszkodliwić ich.
Gianluca Demarinis


3

Ta linia powoduje zaznaczenia z readonlyatrybutem tylko do odczytu:

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

2

Ten kod najpierw zapisze oryginalny wybór w każdym menu rozwijanym. Następnie, jeśli użytkownik zmieni wybór, zresetuje listę rozwijaną do pierwotnego wyboru.

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

Najłatwiejszą opcją dla mnie było wybranie jako tylko do odczytu i dodanie:

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

Nie musisz pisać żadnej dodatkowej logiki. Brak ukrytych danych wejściowych lub wyłączone, a następnie ponownie włączone po przesłaniu formularza.


1

To stary artykuł, ale chcę ostrzec ludzi, którzy go znajdą. Uważaj na wyłączony atrybut z elementem pobranym po nazwie. Dziwne, ale wydaje się, że nie działa.

to nie działa:

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

ta praca:

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

Tak, wiem, że powinienem użyć prop, a nie attr, ale przynajmniej teraz prop nie będzie działał z powodu starej wersji jquery, a teraz nie mogę go zaktualizować, nie pytaj dlaczego ... różnica HTML jest tylko dodana 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()" />

...

Nie znalazłem żadnych błędów w skrypcie, aw wersji z nazwą nie było błędów w konsoli. Ale oczywiście może to być mój błąd w kodzie

Widziane na: Chrome 26 na Win 7 Pro

Przepraszam za złą gramatykę.


1

Odkryłem, że lepszym sposobem na to jest użycie CSS do usunięcia zdarzeń wskaźników i zmodyfikowania krycia na liście rozwijanej (spróbuj 0.5). Dzięki temu użytkownik ma wrażenie, że jest normalnie wyłączony, ale nadal publikuje dane.

To prawda, że ​​ma to pewne problemy z kompatybilnością wsteczną, ale moim zdaniem jest lepszą opcją niż obejście irytującego problemu z wyłączonymi / tylko do odczytu.


Czy możesz rozwinąć wymagane do tego CSS?
Cocowalla

1

Możesz również go wyłączyć, a w momencie, gdy wykonujesz połączenie, włącz go. Myślę, że to najłatwiejszy sposób :)


1

Działa bardzo dobrze

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

Dzięki temu widzę opcje, ale nie mogę ich wybrać


0

Nie ma listy rozwijanej tylko do odczytu. To, co możesz zrobić, to zresetować go do pierwszej wartości ręcznie po każdej zmianie.

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

http://jsfiddle.net/4aHcD/


3
źle, jeśli aktualnie wybrana opcja nie jest pierwsza na liście, jak w tym przykładzie: jsfiddle.net/4aHcD/19
Homer

@Homer, kod ma na celu zresetowanie go po każdej zmianie i działa w ten sposób. Jeśli chcesz, aby działał początkowo zamiast samodzielnie zmieniać wartość początkową z jakiegoś powodu, zawsze możesz wywołać zdarzenie zmiany w swoim elemencie po jego zadeklarowaniu, używając $("select").change(), jak na przykład jsfiddle.net/4aHcD/20
Alex Turpin

2
gdy strona jest ładowana po raz pierwszy, jeśli trzeci element jest zaznaczony, a użytkownik spróbuje zmienić go na drugi element, kod zmienia zaznaczenie na pierwszy element. Myślę, że nie powinno tego robić. Oto przykład tego, czego, jak sądzę, chciał OP, menu rozwijanego, które nie zmieni wybranej wartości na podstawie interakcji użytkownika: jsfiddle.net/4aHcD/22
Homer

Co potrzebne i co OP został zainteresowanie było sposobem zrobić to tylko do odczytu. Oznacza to, że możesz zobaczyć wybraną wartość lub wartości, ale nie możesz ich zmienić. Oznacza to, że wyświetlacz naśladuje wygląd edytowalnej kontrolki bez możliwości jej edycji.
Suncat2000 12.12.13

0

Spróbuj zrobić pusty ciąg, gdy „naciśniesz klawisz w górę”

Html to:

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

Jquery to:

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

// po wpisaniu klucza z pustym ciągiem

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

0

Może możesz spróbować w ten sposób

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

Spowoduje to ustawienie pierwszej wartości listy rozwijanej jako domyślnej i wydaje się, że jest ona przeznaczona tylko do odczytu


0

HTML5 obsługujący:

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

`


0

Oto niewielka wariacja na temat innych odpowiedzi, które sugerują użycie wyłączonych. Ponieważ atrybut „disabled” może mieć w rzeczywistości dowolną wartość i nadal jest wyłączony, można ustawić go jako tylko do odczytu, na przykład disabled = „readonly”. Spowoduje to normalne wyłączenie kontrolki, a także pozwoli Ci łatwo nadać jej styl inny niż zwykłe wyłączone kontrolki, z CSS takimi jak:

select[disabled=readonly] {
    .... styles you like for read-only
}

Jeśli chcesz przesłać dane, użyj ukrytych pól lub włącz je przed przesłaniem, jak opisano w innych odpowiedziach.


0

Jak powiedział @Kanishka, jeśli wyłączymy element formularza, nie zostanie on przesłany. Utworzyłem fragment opisujący ten problem. Gdy element select jest wyłączony, tworzy ukryte pole wejściowe i przechowuje wartość. Gdy jest włączony, usuwa utworzone ukryte pola wejściowe.

Więcej informacji

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>

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.