Zgodnie ze specyfikacjami HTML select
tag w HTML nie ma readonly
atrybutu, tylko disabled
atrybut. Więc jeśli chcesz powstrzymać użytkownika przed zmianą listy rozwijanej, musisz użyć disabled
.
Jedynym problemem jest to, że wyłączone dane formularzy HTML nie są uwzględniane w danych POST / GET.
Jaki jest najlepszy sposób na emulację readonly
atrybutu dla select
tagu i uzyskanie danych POST?
javascript
html
Jrgns
źródło
źródło
Odpowiedzi:
Powinieneś zachować
select
element,disabled
ale także dodać kolejny ukrytyinput
o tej samej nazwie i wartości.Jeśli ponownie włączysz SELECT, powinieneś skopiować jego wartość do ukrytego wejścia w zdarzeniu onchange i wyłączyć (lub usunąć) ukryte wejście.
Oto demo:
źródło
selected
zwracana jest tylko wartość, a nie cała lista. Tak więc twoje miejscehidden
przed tobąselect
i utrzymuje wybraną wartość. Jeśli zaznaczenie zostanie wyłączone dla opcji „tylko do odczytu”, wiadomość zwrotna będzie zawierać tylko wartość ukrytego wejścia. Jeśli zaznaczenie jest włączone, widoczna wybrana opcja „nadpisuje / zamienia” ukrytą wartość, a to jest wartość, która zostanie ponownie wysłana.Przydałoby się to również
Wyłącz wszystkie oprócz wybranej opcji:
W ten sposób menu rozwijane nadal działa (i przesyła swoją wartość), ale użytkownik nie może wybrać innej wartości.
Próbny
źródło
option
znacznikadisabled
$("#yourSelectId option:not(:selected)).attr("disabled", "disabled")
Możesz ponownie włączyć wybrany obiekt po przesłaniu.
EDYTOWAĆ : tzn. Zwykle wyłącza tag wyboru (z atrybutem disabled), a następnie automatycznie włącza go ponownie przed przesłaniem formularza:
Przykład z jQuery:
Aby to wyłączyć:
Aby włączyć ponownie przed wysłaniem, aby uwzględnić dane GET / POST:
Ponadto można ponownie włączyć każde wyłączone wejście lub wybrać:
źródło
inny sposób
readOnly
przypisania atrybutu doselect
elementu jest użyciecss
możesz zrobić jak:
PRÓBNY
źródło
... .on('mouseover', function(){ ... });
pointer-events: none
uniemożliwia skupienie kursora myszy. Aby także uniknąć fokusu z klawiatury, możesz go uzupełnić, rozmywając natychmiast wszystkie zdarzenia fokusowe:$('select').css('pointer-events', 'none').on('focus', function () {$(this).blur();});
Testowane i działające w IE 6, 7 i 8b2, Firefox 2 i 3, Opera 9.62, Safari 3.2.1 dla Windows i Google Chrome.
źródło
<select id="countries"> <option value="7" selected="selected">Country7</option> </select>
onchange = 'this.selectedIndex=this.defaultIndex; alert("You should not change this..");'
zamiast po prostu cicho zmieniać wybrany indeks.not-allowed
i kolor tła na#CCC
.Proste rozwiązanie jQuery
Użyj tego, jeśli wybrani mają
readonly
klasęLub to, jeśli wybrane mają
readonly="readonly"
atrybutźródło
$(document).ready(function(){$('select option:not(:selected)').attr('disabled',true);});
działa dobrze w przypadku pojedynczego wyboru. Nie jest wymagana klasa „tylko do odczytu”. Wybór wielokrotny jest problematyczny, ponieważ jeśli jest już wybrana więcej niż jedna opcja, a więc nie jest wyłączona, a użytkownik wybierze jedną z nie wyłączonych opcji, pozostałe wcześniej wybrane opcje zostaną odznaczone.$select.find('option').not(':selected').attr('disabled', 'disabled');
select[readonly]
, aby po prostu dodać atrybut readonly do elementu - w ten sposób nie musisz traktować zaznaczeń inaczej niż jakiegokolwiek innego typu. Javascript stopniowo zwiększa efekt. Należy pamiętać, że to rozwiązanie (i większość innych) pomaga tylko klientowi zapewnić najlepszą obsługę - w rzeczywistości niczego nie wymusza (w razie potrzeby należy to zrobić po stronie serwera).Proste rozwiązanie CSS:
Powoduje to, że Select jest szary z ładnym kursorem „wyłącz” po najechaniu myszką,
a po wybraniu lista opcji jest „pusta”, więc nie można zmienić jej wartości.
źródło
Jeszcze inną bardziej współczesną opcją (bez zamierzonej gry słów) jest wyłączenie wszystkich opcji elementu select innego niż wybrany.
Zwróć jednak uwagę, że jest to funkcja HTML 4.0 i wydaje się, że 6,7,8 beta 1 tego nie przestrzega.
http://www.gtalbot.org/BrowserBugsSection/MSIE7Bugs/OptionDisabledSupport.html
źródło
To najlepsze rozwiązanie, jakie znalazłem:
Powyższy kod wyłącza wszystkie inne niewybrane opcje, pozostawiając zaznaczoną opcję włączoną. W ten sposób wybrana opcja przejdzie do danych po wycofaniu.
źródło
Wiem, że jest o wiele za późno, ale można to zrobić za pomocą prostego CSS:
Styl ukrywa wszystkie opcje i grupy, gdy zaznaczenie jest włączone
readonly
stanie, więc użytkownik nie może zmienić swojego wyboru.Nie są potrzebne żadne włamania JavaScript.
źródło
Jeszcze łatwiej: dodaj atrybut style do tagu select :
źródło
To jest najprostsze i najlepsze rozwiązanie. Ustawisz readolny attr na wybranym elemencie lub dowolnym innym atrybucie, takim jak read-only data, i wykonaj następujące czynności
źródło
Ustaw opcję wyłączony, gdy planujesz, aby była tylko do odczytu, a następnie usuń atrybut wyłączony tuż przed przesłaniem formularza.
źródło
Oprócz wyłączenia opcji, które nie powinny być dostępne, chciałem sprawić, by zniknęły z listy, ale nadal mogę je włączyć, jeśli będę musiał później:
Znajduje wszystkie elementy select z atrybutem tylko do odczytu, a następnie znajduje wszystkie opcje wewnątrz tych zaznaczeń, które nie są zaznaczone, a następnie ukrywa je i wyłącza.
Ważne jest oddzielenie zapytania jquery w 2 ze względu na wydajność, ponieważ jquery czyta je od prawej do lewej, kod:
najpierw znajdzie wszystkie niezaznaczone opcje w dokumencie, a następnie odfiltruje te, które są w środku, zaznacza za pomocą atrybutu tylko do odczytu.
źródło
.prop("disabled", true)
zamiast tegoJednym prostym podejściem po stronie serwera jest usunięcie wszystkich opcji oprócz tej, którą chcesz wybrać. Zatem w Zend Framework 1.12, jeśli $ element jest Zend_Form_Element_Select:
źródło
Jeśli wyłączysz pole formularza, nie zostanie ono wysłane po przesłaniu formularza. Więc jeśli potrzebujesz
readonly
który działa,disabled
ale wysyłanie wartości zrób to:Po każdej zmianie właściwości tylko do odczytu elementu.
źródło
Rozwiązanie z tabindex.Działa z wybranymi, ale także z wprowadzaniem tekstu.
Wystarczy użyć klasy .disabled.
CSS:
JS:
HTML:
Edycja: W przeglądarce Internet Explorer potrzebujesz również tego JS:
źródło
Zgodnie z sugestią Granta Wagnersa; oto fragment kodu jQuery, który robi to z funkcjami modułu obsługi zamiast bezpośrednich atrybutów onXXX:
źródło
Rozwiązałem to za pomocą jquery:
źródło
Jeśli używasz sprawdzania poprawności jquery, możesz wykonać następujące czynności, bez problemu użyłem atrybutu disabled:
źródło
To, co znalazłem, działa świetnie, przy zwykłym javascript (tj .: nie jest wymagana biblioteka JQuery), jest zmiana innerHTML
<select>
znacznika na pożądaną pojedynczą pozostałą wartość.Przed:
Przykładowy Javascript:
Po:
W ten sposób nie zmieni się efekt wizualny, a to POST / GET w
<FORM>
.źródło
Zamiast samego wyboru można wyłączyć wszystkie opcje oprócz aktualnie wybranej opcji. Daje to wygląd działającego menu, ale poprawna jest tylko opcja, którą chcesz przekazać.
źródło
rozwiązanie HTML:
javascript:
usuwać:
edycja: dodano metody usuwania
źródło
Po prostu usuń wyłączony atrybut przed przesłaniem formularza.
źródło
disabled="disabled" ->
dostanie twoją wartość z bazy danych i pokaż ją w formularzu.readonly="readonly" ->
możesz zmienić swoją wartość w polu wyboru, ale nie możesz zapisać swojej wartości w bazie danych.źródło
Jeśli lista rozwijana wyboru jest tylko do odczytu od urodzenia i wcale nie musi się zmieniać, być może powinieneś użyć innej kontroli? Jak proste
<div>
(plus ukryte pole formularza) czy<input type="text">
?Dodano: Jeśli lista rozwijana nie jest dostępna tylko do odczytu, a JavaScript jest używany do jej włączenia / wyłączenia, to nadal jest to rozwiązanie - wystarczy zmodyfikować DOM w locie.
źródło
Poniżej pracował dla mnie:
źródło
Udało mi się to, ukrywając pole wyboru i pokazując na
span
jego miejscu jedynie wartość informacyjną. W przypadku wyłączenia.readonly
klasy musimy również usunąć.toVanish
elementy i pokazać je.toShow
.źródło
W IE udało mi się pokonać podejście onfocus => onblur, klikając dwukrotnie. Ale zapamiętywanie wartości, a następnie przywracanie jej w zdarzeniu onchange wydaje się rozwiązywać ten problem.
Możesz zrobić podobnie bez właściwości expando, używając zmiennej javascript.
źródło
Oto próba użycia niestandardowej funkcji jQuery w celu osiągnięcia tej funkcjonalności (jak wspomniano tutaj):
źródło