Formularz HTML tylko do odczytu WYBIERZ znacznik / wejście


587

Zgodnie ze specyfikacjami HTML selecttag w HTML nie ma readonlyatrybutu, tylko disabledatrybut. 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ę readonlyatrybutu dla selecttagu i uzyskanie danych POST?


5
Nie polegaj na tym po stronie serwera. Każdy może stworzyć własną stronę HTML i zrobić z niej RW.
Brendan Byrd

11
Ale to nie jest pytanie specyficzne dla PHP.
Kaleb Brasee

4
W tym przypadku sugerowałbym, aby w ogóle nie używać elementu select. Czy jest jakiś powód, dla którego nie możesz po prostu wyświetlić wartości jako zwykłego tekstu?
Big McLargeHuge

2
@ppumkin twój komentarz nie ma sensu. Nie twierdzę, że nigdy nie ma dobrego przypadku użycia dla wybranych lub ukrytych pól formularza. OP miał problem z wyświetleniem jakiegoś tekstu na stronie, a ja po prostu zastanawiałem się, jaki jest cel użycia elementu select w tym przypadku.
Big McLargeHuge

2
Muszę czytać złe pytanie. Mówi, że chce wyłączyć zaznaczenie, aby użytkownik go nie zmienił. Może musi wyrenderować stronę z zaznaczeniami i użyć jquery, aby zapobiec zmianom. Ale kiedy przesyła go z powrotem, nie ma na to danych. Robiłem to samo. Muszę wyświetlić selekcje, które są filtrowane przez inne selekcje, a ostatnia lista rozwijana zapisuje się w DB za pośrednictwem ajax, więc wszystkie poprzednie muszą zostać zablokowane. Kiedy renderuję stronę, tak, OK - mógłbym wyświetlać etykiety zamiast zaznaczeń. Ale to nie jest problem :)
Piotr Kula,

Odpowiedzi:


461

Powinieneś zachować selectelement, disabledale także dodać kolejny ukryty inputo 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:

$('#mainform').submit(function() {
    $('#formdata_container').show();
    $('#formdata').html($(this).serialize());
    return false;
});

$('#enableselect').click(function() {
    $('#mainform input[name=animal]')
        .attr("disabled", true);
    
    $('#animal-select')
        .attr('disabled', false)
    	.attr('name', 'animal');
    
    $('#enableselect').hide();
    return false;
});
#formdata_container {
    padding: 10px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
    <form id="mainform">
        <select id="animal-select" disabled="true">
            <option value="cat" selected>Cat</option>
            <option value="dog">Dog</option>
            <option value="hamster">Hamster</option>
        </select>
        <input type="hidden" name="animal" value="cat"/>
        <button id="enableselect">Enable</button>
        
        <select name="color">
            <option value="blue" selected>Blue</option>
            <option value="green">Green</option>
            <option value="red">Red</option>
        </select>

        <input type="submit"/>
    </form>
</div>

<div id="formdata_container" style="display:none">
    <div>Submitted data:</div>
    <div id="formdata">
    </div>
</div>


5
Jeśli włączysz zaznaczenie, musisz oczywiście wyłączyć lub usunąć ukryte dane wejściowe (po skopiowaniu ich wartości zgodnie z opisem). W przeciwnym razie otrzymasz podwójną wartość
Adam

1
@max Ah !. Ok, to też działa. Zakładałem, że odkąd powiedziałeś, że ukryte dane wejściowe powinny mieć „taką samą nazwę”, jak nazwa wybranego.
Adam

2
Co jeśli używam wielokrotnego wyboru?
Anyul Rivas

2
Posiadanie dwóch elementów o tych samych nazwach spowoduje wysłanie tylko ostatniego włączonego / wybranego wejścia, a nie podwójnego. Ponadto selectedzwracana jest tylko wartość, a nie cała lista. Tak więc twoje miejsce hiddenprzed tobą selecti 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.
Piotr Kula,

29
Chociaż jest to oczywiste rozwiązanie, jest do bani jako rozwiązanie, ponieważ musisz dodać kolejne pole wejściowe.
Donato,

189

Przydałoby się to również

Wyłącz wszystkie oprócz wybranej opcji:

<select>
    <option disabled>1</option>
    <option selected>2</option>
    <option disabled>3</option>
</select>

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


3
Fajny dla opcji dynamicznych
Diego Favero

10
Idealny dla tagu SELECT o pojedynczej wartości! Ale nie będzie działać dla <wybierz wiele>, co nadal pozwoli użytkownikom odznaczyć niektóre z wybranych opcji, zmieniając w ten sposób wartość.
Michaił Bunkin

2
Obsługa przeglądarki dla atrybutu optionznacznikadisabled
Jo.

4
To świetne rozwiązanie. Dodam, że możesz to łatwo osiągnąć za pomocą jQuery w następujący sposób: $("#yourSelectId option:not(:selected)).attr("disabled", "disabled")
Onkel-j

105

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

    $('#yourSelect').prop('disabled', true);
  • Aby włączyć ponownie przed wysłaniem, aby uwzględnić dane GET / POST:

    $('#yourForm').on('submit', function() {
        $('#yourSelect').prop('disabled', false);
    });

Ponadto można ponownie włączyć każde wyłączone wejście lub wybrać:

$('#yourForm').on('submit', function() {
    $('input, select').prop('disabled', false);
});

4
użyj .prop („disabled”, true / false), aby ustawić właściwość disabled. Atrybut nie zmieni stanu faktycznego.
Paris Char

Myślę, że to rozwiązanie jest mądrzejsze niż @bezmax . Ponieważ dodając ukryte dane wejściowe, musieliśmy wziąć pod uwagę, że tylko jedno z nich (ta sama nazwa) było dostępne w dowolnym momencie. W przeciwnym razie, jeśli oba wejścia zostały włączone, po stronie serwera program pobierze tablicę danych wejściowych, które mogą być przyczyną wyjątku (na przykład, jeśli nie poradzimy sobie z tą sytuacją i oczekujemy jednego ciągu znaków i użyjemy 'Request.Form [FieldName] 'polecenie)
MiT

@Kevin, działa> 90% przypadków. Poza tym musisz mieć jquery za paskiem ... Eh.
sitilge

Jest to o wiele czystsza zaakceptowana odpowiedź. Łatwiej cofnąć logikę, jeśli nie chcesz, aby element był wyłączany i nie ma żadnych dodatkowych znaczników wejściowych.
Haohmaru,

51

inny sposób readOnlyprzypisania atrybutu doselect elementu jest użyciecss

możesz zrobić jak:

$('#selection').css('pointer-events','none');

PRÓBNY


8
Niezłe rozwiązanie. Ale nadal możesz zmienić wartość za pomocą klawiatury.
Mario Werner,

1
Tak, to jest niesamowite. Aby zmienić wartość za pomocą klawiatury, należy nacisnąć TAB na elemencie, a następnie zostanie on wybrany. Jeśli zmienisz kolor tła na szary lub wyłączony, wizualnie poinformujesz również użytkownika, że ​​jest on „wyłączony”, kiedy w rzeczywistości nie jest wyłączony. Nikt już nie obsługuje IE, więc kogo to obchodzi. Możesz także ustawić domyślną blokadę klawiszy, jeśli chcesz temu zapobiec.
Piotr Kula,

Całkiem niekonwencjonalny !! Jeśli zaznaczenie musi zostać zablokowane w renderowaniu strony,... .on('mouseover', function(){ ... });
Fr0zenFyr

pointer-events: noneuniemoż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();});
Quinn Comendant

39
<select id="countries" onfocus="this.defaultIndex=this.selectedIndex;" onchange="this.selectedIndex=this.defaultIndex;">
<option value="1">Country1</option>
<option value="2">Country2</option>
<option value="3">Country3</option>
<option value="4">Country4</option>
<option value="5">Country5</option>
<option value="6">Country6</option>
<option value="7" selected="selected">Country7</option>
<option value="8">Country8</option>
<option value="9">Country9</option>
</select>

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.


15
Problem polega na tym, że menu rozwijane jest renderowane tak, jakby nie było tylko do odczytu. Użytkownik pomyśli, że to nie działa ...
Lukas Eder

8
Jest to mylące dla użytkownika, ponieważ nadal może wybrać opcję, ale gdy ją wybierze, lista zmieni się z powrotem na poprzednio wybraną wartość. Wyłączenie listy jest o wiele bardziej intuicyjne, aby uniemożliwić użytkownikowi wybranie czegokolwiek.
dana

11
Miałem podobny problem i rozwiązałem go, wyświetlając tylko wybraną opcję. Nie wymaga JS, mniej zamieszania dla użytkownika ... <select id="countries"> <option value="7" selected="selected">Country7</option> </select>
Potherca,

1
@ppumkin @dana @LukasEder Nie .. nie, jeśli możesz naprawić ten UX. Na przykład, możesz zrobić coś takiego, onchange = 'this.selectedIndex=this.defaultIndex; alert("You should not change this..");'zamiast po prostu cicho zmieniać wybrany indeks.
Fr0zenFyr

1
@LukasEder Dla każdego, kto podejrzy się na temat respondenta, może dodać trochę CSS, aby naprawdę podkreślić, że rozwijanego menu nie należy zmieniać. Ustaw kursor na not-allowedi kolor tła na #CCC.
Alexander Dixon

36

Proste rozwiązanie jQuery

Użyj tego, jeśli wybrani mają readonlyklasę

jQuery('select.readonly option:not(:selected)').attr('disabled',true);

Lub to, jeśli wybrane mają readonly="readonly"atrybut

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

7
Wyjaśnij trochę swój kod. Czy musimy dodać klasę „tylko do odczytu” do wybranych elementów? Kiedy musimy wywołać ten kod: tylko w document.ready lub za każdym razem, gdy zaznaczenie jest włączone / wyłączone? Czy twój kod noscript jest bezpieczny?
anar khalilov

$(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.
Gordon

nic z tego nie rozumiem.
Piotr Kula,

Wyłącza opcje inne niż wybrana dla pól wyboru z klasą „tylko do odczytu”. Jeśli masz pod ręką element select, możesz napisać:$select.find('option').not(':selected').attr('disabled', 'disabled');
Semra

1
Podoba mi się to rozwiązanie. Zmieniłbym selektor na 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).
jgivoni

21

Proste rozwiązanie CSS:

select[readonly]{
    background: #eee;
    cursor:no-drop;
}

select[readonly] option{
    display:none;
}

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.


1
Jeśli masz walidację CSRF (jak w symfony i wielu innych frameworkach), to nie zadziała.
ThEBiShOp


11

To najlepsze rozwiązanie, jakie znalazłem:

$("#YourSELECTIdHere option:not(:selected)").prop("disabled", true);

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.


11

Wiem, że jest o wiele za późno, ale można to zrobić za pomocą prostego CSS:

select[readonly] option, select[readonly] optgroup {
    display: none;
}

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.


Ładne i proste. Lubię to.
Jonathan Parent Lévesque

To bardzo miłe rozwiązanie problemu. Dziękuję Ci!
OderWat

10

Jeszcze łatwiej: dodaj atrybut style do tagu select :

style="pointer-events: none;"

Działa to dla mnie, ale zdarzenia wskaźnika umożliwią obsługę wielu przeglądarek?
Abhijit Jagtap,

3
To nie zadziała. Użytkownik może zmienić dane wejściowe za pomocą klawiatury.
Sandhu

6

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

$("select[readonly]").live("focus mousedown mouseup click",function(e){
    e.preventDefault();
    e.stopPropagation();
});

1
powinieneś dodać tutaj skrót klawiszowy reklamy, a rozwijane menu jest nadal dostępne po „tabulacji” i zmienianie wartości za pomocą klawiszy strzałek.
apfz

5

Ustaw opcję wyłączony, gdy planujesz, aby była tylko do odczytu, a następnie usuń atrybut wyłączony tuż przed przesłaniem formularza.

// global variable to store original event/handler for save button
var form_save_button_func = null;

// function to get jQuery object for save button
function get_form_button_by_id(button_id) {
    return jQuery("input[type=button]#"+button_id);
}

// alter value of disabled element
function set_disabled_elem_value(elem_id, value)  {
    jQuery("#"+elem_id).removeAttr("disabled");
    jQuery("#"+elem_id).val(value);
    jQuery("#"+elem_id).attr('disabled','disabled');
}

function set_form_bottom_button_save_custom_code_generic(msg) {
    // save original event/handler that was either declared
    // through javascript or html onclick attribute
    // in a global variable
    form_save_button_func = get_form_button_by_id('BtnSave').prop('onclick'); // jQuery 1.6
    //form_save_button_func = get_form_button_by_id('BtnSave').prop('onclick'); // jQuery 1.7

    // unbind original event/handler (can use any of following statements below)
    get_form_button_by_value('BtnSave').unbind('click');
    get_form_button_by_value('BtnSave').removeAttr('onclick');

    // alternate save code which also calls original event/handler stored in global variable
    get_form_button_by_value('BtnSave').click(function(event){
        event.preventDefault();
        var confirm_result = confirm(msg);
        if (confirm_result) {
            if (jQuery("form.anyForm").find('input[type=text], textarea, select').filter(".disabled-form-elem").length > 0) {
                jQuery("form.anyForm").find('input[type=text], textarea, select').filter(".disabled-form-elem").removeAttr("disabled");
            }

            // disallow further editing of fields once save operation is underway
            // by making them readonly
            // you can also disallow form editing by showing a large transparent
            // div over form such as loading animation with "Saving" message text
            jQuery("form.anyForm").find('input[type=text], textarea, select').attr('ReadOnly','True');

            // now execute original event/handler
            form_save_button_func();
        }
    });
}

$(document).ready(function() {
    // if you want to define save button code in javascript then define it now

    // code below for record update
    set_form_bottom_button_save_custom_code_generic("Do you really want to update this record?");
    // code below for new record
    //set_form_bottom_button_save_custom_code_generic("Do you really want to create this new record?");

    // start disabling elements on form load by also adding a class to identify disabled elements
    jQuery("input[type=text]#phone").addClass('disabled-form-elem').attr('disabled','disabled');
    jQuery("input[type=text]#fax").addClass('disabled-form-elem').attr('disabled','disabled');
    jQuery("select#country").addClass('disabled-form-elem').attr('disabled','disabled');
    jQuery("textarea#address").addClass('disabled-form-elem').attr('disabled','disabled');

    set_disabled_elem_value('phone', '123121231');
    set_disabled_elem_value('fax', '123123123');
    set_disabled_elem_value('country', 'Pakistan');
    set_disabled_elem_value('address', 'address');

}); // end of $(document).ready function

To brzmi jak warunek wyścigu, który czeka.
Brendan Byrd

5

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:

$("select[readonly]").find("option:not(:selected)").hide().attr("disabled",true);

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:

$("select[readonly] option:not(:selected)")

najpierw znajdzie wszystkie niezaznaczone opcje w dokumencie, a następnie odfiltruje te, które są w środku, zaznacza za pomocą atrybutu tylko do odczytu.


Może .prop("disabled", true)zamiast tego
Sam

4

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

 $value =  $element->getValue();
 $options = $element->getAttrib('options');
 $sole_option = array($value => $options[$value]);
 $element->setAttrib('options', $sole_option);

4

Jeśli wyłączysz pole formularza, nie zostanie ono wysłane po przesłaniu formularza. Więc jeśli potrzebujeszreadonly który działa, disabledale wysyłanie wartości zrób to:

Po każdej zmianie właściwości tylko do odczytu elementu.

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

$('select:not([readonly]) option').removeAttr('disabled');

4

Rozwiązanie z tabindex.Działa z wybranymi, ale także z wprowadzaniem tekstu.

Wystarczy użyć klasy .disabled.

CSS:

.disabled {
    pointer-events:none; /* No cursor */
    background-color: #eee; /* Gray background */
}

JS:

$(".disabled").attr("tabindex", "-1");

HTML:

<select class="disabled">
    <option value="0">0</option>
</select>

<input type="text" class="disabled" />

Edycja: W przeglądarce Internet Explorer potrzebujesz również tego JS:

$(document).on("mousedown", ".disabled", function (e) {
    e.preventDefault();
});

2

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:

var readonlySelect = function(selector, makeReadonly) {

    $(selector).filter("select").each(function(i){
        var select = $(this);

        //remove any existing readonly handler
        if(this.readonlyFn) select.unbind("change", this.readonlyFn);
        if(this.readonlyIndex) this.readonlyIndex = null;

        if(makeReadonly) {
            this.readonlyIndex = this.selectedIndex;
            this.readonlyFn = function(){
                this.selectedIndex = this.readonlyIndex;
            };
            select.bind("change", this.readonlyFn);
        }
    });

};

2

Rozwiązałem to za pomocą jquery:

      $("select.myselect").bind("focus", function(){
        if($(this).hasClass('readonly'))
        {
          $(this).blur();   
          return;
        }
      });

Działa to bardzo ładnie, chociaż animacja najechania myszą nadal pokazuje strzałkę rozwijaną, która wygląda na klikalną.
Johncl

To nie działa dla mnie w Chrome 26: wybór jest nadal w pełni funkcjonalny.
Andy,

Ale nadal pokazuje listę po dwukrotnym kliknięciu w IE. W każdym razie, aby temu zapobiec?
user1995781,

2

Jeśli używasz sprawdzania poprawności jquery, możesz wykonać następujące czynności, bez problemu użyłem atrybutu disabled:

$(function(){
    $('#myform').validate({
        submitHandler:function(form){
            $('select').removeAttr('disabled');
            form.submit();
        }
    });
});

2

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:

<select name='day' id='day'>
  <option>SUN</option>
  <option>MON</option>
  <option>TUE</option>
  <option>WED</option>
  <option>THU</option>
  <option>FRI</option>
  <option>SAT</option>
</select>

Przykładowy Javascript:

document.getElementById('day').innerHTML = '<option>FRI</option>';

Po:

<select name='day' id='day'>
  <option>FRI</option>
</select>

W ten sposób nie zmieni się efekt wizualny, a to POST / GET w <FORM>.


1

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


3
Teoretycznie świetny pomysł - ale nie ma obsługi wyłączonych opcji w IE przed IE8. tinyurl.com/yle4bto
scunliffe

1

rozwiązanie HTML:

<select onfocus="this.blur();">

javascript:

selectElement.addEventListener("focus", selectElement.blur, true); selectElement.attachEvent("focus", selectElement.blur); //thanks, IE

usuwać:

selectElement.removeEventListener("focus", selectElement.blur, true); selectElement.detachEvent("focus", selectElement.blur); //thanks, IE

edycja: dodano metody usuwania


@ButtleButkus czy te javascript działają? myślę, że może to być problem związany z przeglądarką. czy próbowałeś dodać tabindex do elementu
Kadmillos

1

Po prostu usuń wyłączony atrybut przed przesłaniem formularza.

    $('form').submit(function () {
        $("#Id_Unidade").attr("disabled", false);
    });

1
<select id="case_reason" name="case_reason" disabled="disabled">

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.


źle, to jest zapisane. Wygląda na to, że właściwość „tylko do odczytu” nie jest przetwarzana przez wszystkie przeglądarki, a zatem nie jest wiarygodna.
richey

0

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.


To nie jest tylko od początku. Używam JavaScript do zmiany i aktualizacji. Jeśli poprzednia lista rozwijana ma określoną wartość, ta staje się tylko do odczytu.
Jrgns,

Może więc możesz zastąpić to rozwijane pole tekstowe w locie?
Vilx

Tak, ale zawsze ukryte dane wejściowe są moim zdaniem bardziej eleganckie
Jrgns

0

Poniżej pracował dla mnie:

$('select[name=country]').attr("disabled", "disabled"); 

11
FYI: Wyłączone pole formularza nie zostanie uwzględnione w przesłanym pliku.
mz_01,

0

Udało mi się to, ukrywając pole wyboru i pokazując na spanjego miejscu jedynie wartość informacyjną. W przypadku wyłączenia .readonlyklasy musimy również usunąć .toVanishelementy i pokazać je .toShow.

 $( '.readonly' ).live( 'focus', function(e) {
                $( this ).attr( 'readonly', 'readonly' )
                if( $( this ).get(0).tagName == 'SELECT' ) {
                    $( this ).before( '<span class="toVanish readonly" style="border:1px solid; padding:5px">' 
                            + $( this ).find( 'option:selected' ).html() + '</span>' )
                    $( this ).addClass( 'toShow' )
                    $( this ).hide()
            }
    });

0

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.

<select onfocus="this.oldvalue=this.value;this.blur();" onchange="this.value=this.oldvalue;">
....
</select>

Możesz zrobić podobnie bez właściwości expando, używając zmiennej javascript.


0

Oto próba użycia niestandardowej funkcji jQuery w celu osiągnięcia tej funkcjonalności (jak wspomniano tutaj):

$(function(){

 $.prototype.toggleDisable = function(flag) {
    // prepare some values
    var selectId = $(this).attr('id');
    var hiddenId = selectId + 'hidden';
    if (flag) {
      // disable the select - however this will not submit the value of the select
      // a new hidden form element will be created below to compensate for the 
      // non-submitted select value 
      $(this).attr('disabled', true);

      // gather attributes
      var selectVal = $(this).val();
      var selectName = $(this).attr('name');

      // creates a hidden form element to submit the value of the disabled select
      $(this).parents('form').append($('<input></input>').
        attr('type', 'hidden').
        attr('id', hiddenId).
        attr('name', selectName).
        val(selectVal) );
    } else {
      // remove the newly-created hidden form element
      $(this).parents('form').remove(hiddenId);
      // enable back the element
      $(this).removeAttr('disabled');
    }
  }

  // Usage
  // $('#some_select_element').toggleDisable(true);
  // $('#some_select_element').toggleDisable(false);

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