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:
Ś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);
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 );
});
<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>
Ś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:
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.
//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);
});
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.
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:. ..
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.
ź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ę”
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 likeforread-only
}
Jeśli chcesz przesłać dane, użyj ukrytych pól lub włącz je przed przesłaniem, jak opisano w innych odpowiedziach.
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.
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
}
});
});
Odpowiedzi:
$('#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
źródło
prop()
teraz używać .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);
źródło
$('option:not(:selected)').prop('disabled', true);
Oto czego szukasz:
$('#cf_1268591').attr("style", "pointer-events: none;");
Działa jak marzenie.
źródło
tabindex="-1"
Spróbuj tego ... bez wyłączania wybranej wartości.
$('#cf_1268591 option:not(:selected)').prop('disabled', true);
Mi to pasuje..
źródło
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 ); });
źródło
Ustawienie elementu z
disabled
nie spowoduje przesłania danych, jednakselect
elementy nie mająreadonly
.Można symulować
readonly
naselect
za 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:
Pokaż fragment kodu
// Updated 08/2018 to prevent changing value with tab $('a').on('click', function() { 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')); }); });
select[readonly] { background: #eee; pointer-events: none; touch-action: none; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <a href="#">Click here to enable readonly</a> <select> <option>Example 1</option> <option selected>Example 2</option> <option>Example 3</option> </select>
źródło
Proste jquery, aby usunąć niewybrane opcje.
$('#your_dropdown_id option:not(:selected)').remove();
źródło
Aby uprościć sprawę, oto wtyczka jQuery, która robi to bez kłopotów: https://github.com/haggen/readonly
źródło
Ta linia powoduje zaznaczenia z
readonly
atrybutem tylko do odczytu:$('select[readonly=readonly] option:not(:selected)').prop('disabled', true);
źródło
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); });
źródło
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.
źródło
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ę.
źródło
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.
źródło
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 :)
źródło
Działa bardzo dobrze
$('#cf_1268591 option:not(:selected)').prop('disabled', true);
Dzięki temu widzę opcje, ale nie mogę ich wybrać
źródło
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/
źródło
$("select").change()
, jak na przykład jsfiddle.net/4aHcD/20Spró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 = ""; });
źródło
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
źródło
HTML5 obsługujący:
` $("#cCity").attr("disabled", "disabled"); $("#cCity").addClass('not-allow');
`
źródło
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.
źródło
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>
źródło