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.

Karim Ali
źródło
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

Kanishka Panamaldeniya
źródło
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);
Bertrand D.
źródło
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.

mainak chakraborty
źródło
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..

Prabhagaran
źródło
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 );
});     
NL3294
źródło
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:

Lucas Bustamante
źródło
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();
abhi chavda
źródło
Również moje rozwiązanie. Lepiej niż unieszkodliwić ich.
Gianluca Demarinis
6

Aby uprościć sprawę, oto wtyczka jQuery, która robi to bez kłopotów: https://github.com/haggen/readonly

Arthur Corenzan
źródło
Świetny (mały) fragment kodu, dzięki. Wyłącza listy rozwijane, więc nie można ich zmienić, ale nadal umożliwia przesyłanie ich wartości. Bardzo przydatne.
Alex Hopkins
3

Ta linia powoduje zaznaczenia z readonlyatrybutem tylko do odczytu:

$('select[readonly=readonly] option:not(:selected)').prop('disabled', true);
admirhodzic
źródło
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);
});
Homer
źródło
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.

Awais Tariq
źródło
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ę.

Andrej
źródło
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.

user3427526
źródło
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 :)

Hictus
źródło
1

Działa bardzo dobrze

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

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

Ricardo Mendes
źródło
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/

Alex Turpin
źródło
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 = "";
});
Hendro
źródło
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

Monicalh
źródło
0

HTML5 obsługujący:

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

`

Atul Kumar
źródło
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.

DaveInMaine
źródło
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>

Amiya
źródło