HTML 양식 읽기 전용 SELECT 태그 / 입력


587

HTML 사양에 따르면 HTML의 select태그에는 readonly속성 이없고 속성 만 disabled있습니다. 따라서 사용자가 드롭 다운을 변경하지 못하게하려면을 사용해야 disabled합니다.

유일한 문제는 비활성화 된 HTML 양식 입력이 POST / GET 데이터에 포함되지 않는다는 것입니다.

태그 의 readonly속성 을 에뮬레이트 select하고 POST 데이터를 얻는 가장 좋은 방법은 무엇입니까 ?


5
서버 측에 의존하지 마십시오. 누구나 자신의 HTML 페이지를 만들어 RW로 만들 수 있습니다.
Brendan Byrd

11
그러나 PHP 관련 질문은 아닙니다.
Kaleb Brasee

4
이 경우 select 요소를 전혀 사용하지 않는 것이 좋습니다. 값을 일반 텍스트로 표시 할 수없는 이유가 있습니까?
Big McLargeHuge

2
@ppumkin 귀하의 의견은 의미가 없습니다. 선택 또는 숨겨진 양식 필드에 대한 유스 케이스가 결코 없다고 말하는 것은 아닙니다. OP는 페이지에 텍스트를 표시하는 데 문제가 있었으며이 경우 select 요소를 사용하는 목적이 무엇인지 궁금했습니다.
Big McLargeHuge

2
잘못된 질문을 읽고 있어야합니다. 그는 사용자가 선택을 변경하지 않도록 선택을 비활성화하고 싶다고 말합니다. 어쩌면 그는 선택을 사용하여 페이지를 렌더링하고 변경을 방지하기 위해 jquery를 사용해야 할 수도 있습니다. 그러나 그가 다시 제출하면 이에 대한 데이터가 없습니다. 나는 똑같이하고 있었다. 다른 선택에 의해 필터링 된 선택을 표시해야하며 마지막 드롭 다운은 ajax를 통해 DB에 저장되므로 이전의 모든 항목을 잠 가야합니다. 예를 들어 페이지를 다시 렌더링하면 선택 대신 레이블을 표시 할 수 있습니다. 그러나 그것은 문제가 아니다 :)
Piotr Kula

답변:


461

select요소를 유지하면서 동일한 이름과 값으로 disabled숨겨진 다른 요소 를 추가 해야 input합니다.

SELECT를 다시 활성화하면 onchange 이벤트에서 해당 값을 숨겨진 입력에 복사하고 숨겨진 입력을 비활성화 (또는 제거)해야합니다.

데모는 다음과 같습니다.

$('#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
선택을 다시 활성화하면 숨겨진 입력을 비활성화하거나 제거해야합니다 (설명대로 값을 복사 한 후). 그렇지 않으면 당신은 두 배로 제출됩니다
Adam

1
@max 아!. 좋아, 그것도 작동합니다. 나는 yo가 숨겨진 입력에 선택의 이름이 "동일한 이름"을 가져야한다고 말한 이후로 가정했습니다.
Adam

2
다중 선택을 사용하는 경우 어떻게합니까?
Anyul Rivas

2
동일한 이름을 가진 두 개의 요소가 있으면 마지막으로 활성화 된 입력 / 선택된 항목 만 두 번이 아니라 다시 게시됩니다. 또한 selected값만 전체 목록에 게시되지 않습니다. 따라서, 당신의 hidden앞에 앉아 select선택한 값을 보유합니다. "읽기 전용"에 대해 선택이 비활성화되면 포스트 백에는 숨겨진 입력 값만 포함됩니다. 선택이 활성화되면 선택된 보이는 옵션이 숨겨진 값을 "덮어 쓰기 / 바꾸기"하고 다시 게시 될 값입니다.
Piotr Kula

29
이것은 명백한 해결책이지만 다른 입력 필드를 추가해야하기 때문에 해결책으로 빠릅니다.
Donato

189

우리는 이것을 사용할 수도 있습니다

선택한 옵션을 제외한 모든 옵션을 비활성화하십시오.

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

이 방법으로 드롭 다운이 계속 작동하고 값을 제출하지만 사용자는 다른 값을 선택할 수 없습니다.

데모


3
다이내믹 옵션의 좋은 점
Diego Favero

11
단일 값 SELECT 태그에 적합합니다! 그러나 <복수 선택>에서는 작동하지 않으므로 사용자가 선택한 옵션 중 일부를 선택 취소하여 값을 변경할 수 있습니다.
Mikhail Bunkin 2016 년

2
option태그 disabled속성에 대한 브라우저 지원
Jo.

4
이것은 훌륭한 솔루션입니다. 다음과 같이 jQuery로 쉽게 달성 할 수 있다고 $("#yourSelectId option:not(:selected)).attr("disabled", "disabled")
덧붙입니다

105

제출시 선택 오브젝트를 다시 사용할 수 있습니다.

편집 : 즉, 일반적으로 select 태그를 비활성화 (disabled 속성 사용) 한 다음 양식을 제출하기 직전에 자동으로 다시 활성화하십시오.

jQuery를 사용한 예 :

  • 비활성화하려면 :

    $('#yourSelect').prop('disabled', true);
  • GET / POST 데이터가 포함되도록 제출하기 전에 다시 활성화하려면 다음을 수행하십시오.

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

또한 모든 비활성화 된 입력을 다시 활성화하거나 다음을 선택할 수 있습니다.

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

4
.prop ( 'disabled', true / false)를 사용하여 disabled 속성을 설정하십시오. 속성은 실제 상태를 변경하지 않습니다.
Paris Char

이 솔루션은 @bezmax 솔루션 보다 영리하다고 생각합니다 . 숨겨진 입력을 추가하는 경우 언제든지 각 입력 중 하나 (동일한 이름) 만 사용하도록 설정해야했습니다. 그렇지 않으면 두 입력을 모두 사용할 수있는 경우 서버 측에서 프로그램은 예외를 유발할 수있는 입력 배열을 가져옵니다 (예 :이 상황을 처리하지 않은 경우 하나의 문자열을 예상하고 'Request.Form [FieldName] 'command)
MiT

@ 케빈 (Kevin)은 90 % 이상을 사용합니다. 또한 벨트에 jquery가 있어야합니다 ... Eh.
sitilge

이것은 받아 들여진 대답보다 훨씬 깨끗합니다. 더 이상 요소를 비활성화하지 않고 추가 입력 태그를 원하지 않는 경우 논리를 쉽게 실행 취소 할 수 있습니다.
Haohmaru

51

요소에 대한 readOnly속성을 수행하는 다른 방법은selectcss

당신은 다음과 같이 할 수 있습니다 :

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

데모


8
좋은 해결책. 그러나 여전히 키보드로 값을 변경할 수 있습니다.
Mario Werner

1
네, 이거 정말 대단합니다. 키보드로 값을 변경하려면 요소를 탭해야하며 그 다음 선택됩니다. 배경색을 회색으로 설정하거나 비활성화하면 실제로 비활성화되어 있지 않은 경우 "비활성화 됨"을 시각적으로 사용자에게 알립니다. 아무도 걱정하지 않는 IE를 더 이상 지원하지 않습니다. 방지하려는 경우 키 다운 방지 기본값을 설정할 수도 있습니다.
Piotr Kula

꽤 정통! 페이지 렌더링에서 선택을 차단해야하는 경우... .on('mouseover', function(){ ... });
Fr0zenFyr

pointer-events: none마우스 커서의 초점을 방지합니다. 키보드에서 포커스를 방지하기 위해 모든 포커스 이벤트에서 즉시 흐리게 표시하여 키보드를 보완 할 수 있습니다.$('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>

IE 6, 7 & 8b2, Firefox 2 & 3, Opera 9.62, Windows 및 Chrome 용 Safari 3.2.1에서 테스트 및 작동


15
이 문제는 드롭 다운이 읽기 전용이 아닌 것처럼 렌더링된다는 것입니다. 사용자는 문제가 작동하지 않는다고 생각할 것입니다 ...
Lukas Eder

8
여전히 옵션을 선택할 수 있기 때문에 사용자에게는 혼란 스러울 수 있지만 옵션을 선택하면 목록이 이전에 선택한 값으로 다시 변경됩니다. 사용자가 아무것도 선택하지 못하도록 목록을 비활성화하는 것이 훨씬 직관적입니다.
dana

11
비슷한 문제가 있었고 선택한 옵션 만 표시하여 해결했습니다. JS가 필요하지 않고 사용자의 혼동이 줄어 듭니다. <select id="countries"> <option value="7" selected="selected">Country7</option> </select>
Potherca

1
@ppumkin @dana @LukasEder No ..이 UX를 고칠 수 있다면 아닙니다. 예를 들어, onchange = 'this.selectedIndex=this.defaultIndex; alert("You should not change this..");'선택한 인덱스를 자동으로 변경하는 대신에 같은 작업을 수행 할 수 있습니다 .
Fr0zenFyr

1
@LukasEder 응답자 경험에 대해 궁금한 사람은 CSS를 추가하여 드롭 다운을 변경해서는 안된다는 것을 실제로 강조 할 수 있습니다. 커서를로 설정하고 not-allowed배경색을로 설정하십시오 #CCC.
Alexander Dixon

36

간단한 jQuery 솔루션

선택에 readonly수업 이있는 경우 사용

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

또는 선택에 readonly="readonly"속성 이있는 경우

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

7
코드를 조금 설명해주세요. select 요소에 'readonly'클래스를 추가해야합니까? 이 코드를 언제 호출해야합니까 : document.ready에서만 또는 선택이 활성화 / 비활성화 될 때마다? 코드가 안전합니까?
anar khalilov

$(document).ready(function(){$('select option:not(:selected)').attr('disabled',true);});단일 선택에서 잘 작동합니다. "읽기 전용"클래스는 필요하지 않습니다. 다중 선택은 이미 하나 이상의 옵션이 선택되어 비활성화되어 있지 않고 사용자가 비활성화되지 않은 옵션 중 하나를 선택하면 이전에 선택한 다른 옵션은 선택되지 않기 때문에 문제가됩니다.
고든

이 중 어느 것도 이해하지 못합니다.
Piotr Kula

"읽기 전용"클래스가있는 선택 상자에 대해 선택된 옵션 이외의 옵션을 비활성화합니다. select 요소가 있다면 다음과 같이 쓸 수 있습니다.$select.find('option').not(':selected').attr('disabled', 'disabled');
Semra

1
나는이 해결책을 좋아한다. select[readonly]요소에 readonly 속성을 추가 하기 위해 선택기를 변경하여 다른 유형과 다르게 선택을 처리 할 필요가 없습니다. 그런 다음 자바 스크립트는 효과를 점진적으로 향상시킵니다. 이 솔루션 (및 대부분의 다른 솔루션)은 사용자 에이전트가 최상의 사용자 경험을 제공하는 데 도움이됩니다. 실제로 어떤 것도 강제하지는 않습니다 (필요한 경우 서버 측에서 수행해야 함).
jgivoni

21

간단한 CSS 솔루션 :

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

select[readonly] option{
    display:none;
}

이로 인해 호버에서 "비활성화"커서가 멋진 상태로 선택되어 회색으로
표시되고 옵션 목록이 "비어 있음"을 선택하면 값을 변경할 수 없습니다.


1
심포니 및 기타 여러 프레임 워크에서와 같이 CSRF 유효성 검사가있는 경우 작동하지 않습니다.
ThEBiShOp


11

이것이 내가 찾은 최고의 솔루션입니다.

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

위의 코드 는 선택한 옵션을 활성화 한 상태에서 다른 모든 옵션을 비활성화 합니다. 이렇게하면 선택한 옵션이 포스트 백 데이터가됩니다.


11

너무 늦다는 것을 알고 있지만 간단한 CSS로 수행 할 수 있습니다.

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

스타일은 선택 readonly상태에 있을 때 모든 옵션과 그룹을 숨기 므로 사용자가 선택을 변경할 수 없습니다.

자바 스크립트 해킹이 필요하지 않습니다.


좋고 간단합니다. 나는 그것을 좋아한다.
Jonathan Parent Lévesque

이것은 문제에 대한 아주 좋은 해결책입니다. 감사합니다!
OderWat

10

더 쉬운 방법 : 스타일 태그를 선택 태그에 추가하십시오 .

style="pointer-events: none;"

그것은 나를 위해 일하지만 포인터 이벤트는 크로스 브라우저를 지원할 것입니까?
Abhijit Jagtap

3
작동하지 않습니다. 사용자는 키보드를 사용하여 입력을 변경할 수 있습니다.
Sandhu

6

이것이 가장 간단하고 최상의 솔루션입니다. 선택시 readolny attr 또는 data-readonly와 같은 다른 attr을 설정하고 다음을 수행하십시오.

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

1
여기에 키업 광고 키 다운을 추가해야하며 드롭 다운을 "탭"하여 사용할 수 있으며 화살표 키를 사용하여 값을 변경해야합니다.
apfz

5

선택을 읽기 전용으로 설정하려는 경우 선택 사용 안함을 설정 한 후 양식을 제출하기 직전에 사용 불가능한 속성을 제거하십시오.

// 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

경쟁 조건이 일어나기를 기다리는 것 같습니다.
Brendan Byrd

5

선택 할 수없는 옵션을 비활성화하는 것 외에도 실제로 목록에서 사라지게하고 싶지만 나중에 필요할 때 활성화 할 수있었습니다.

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

읽기 전용 속성을 가진 모든 선택 요소를 찾은 다음 선택되지 않은 선택 내에서 모든 옵션을 찾은 다음 숨기고 비활성화합니다.

jquery는 코드를 오른쪽에서 왼쪽으로 읽으므로 성능상의 이유로 jquery 쿼리를 2로 분리하는 것이 중요합니다.

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

먼저 문서에서 선택되지 않은 모든 옵션을 찾은 다음 읽기 전용 속성으로 선택 내부에있는 옵션을 필터링합니다.


아마 .prop("disabled", true)대신
sam

4

한 가지 간단한 서버 측 접근 방식은 선택하려는 옵션을 제외한 모든 옵션을 제거하는 것입니다. 따라서 Zend Framework 1.12에서 $ element가 Zend_Form_Element_Select 인 경우 :

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

4

양식 필드를 사용 중지하면 양식이 제출 될 때 전송되지 않습니다. 따라서 readonly작동 disabled하지만 값을 보내는 것이 필요한 경우 다음을 수행하십시오.

요소의 읽기 전용 속성이 변경된 후.

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

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

4

tabindex가있는 솔루션.선택뿐만 아니라 텍스트 입력에서도 작동합니다.

.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" />

편집 : Internet Explorer를 사용하려면 다음 JS도 필요합니다.

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

2

Grant Wagners의 제안에 따라; 다음은 직접 onXXX 속성 대신 핸들러 함수를 사용하여 수행하는 jQuery 스 니펫입니다.

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

jquery로 해결했습니다.

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

마우스 오버 애니메이션에는 여전히 클릭 가능한 것처럼 보이는 드롭 다운 화살표가 표시되지만 이것은 매우 훌륭하게 작동했습니다.
Johncl

Chrome 26에서는 작동하지 않습니다. 선택 기능이 여전히 완벽하게 작동합니다.
Andy

그러나 IE에서 두 번 클릭하면 여전히 목록이 표시됩니다. 어쨌든 그것을 막기 위해?
user1995781

2

jquery validate를 사용하는 경우 다음을 수행 할 수 있습니다 .disabled 속성을 문제없이 사용했습니다.

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

2

내가 찾은 것은 일반 자바 스크립트 (예 : JQuery 라이브러리가 필요하지 않음)와 함께 훌륭하게 작동합니다. <select>태그 의 innerHTML을 원하는 단일 값 으로 변경하는 것 입니다.

전에:

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

샘플 자바 스크립트 :

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

후:

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

이런 식으로, 눈에 띄는 효과가 변경되지 않으며,이 안에 POST / GET됩니다 <FORM>.


1

선택 자체 대신 현재 선택된 옵션을 제외한 모든 옵션을 비활성화 할 수 있습니다. 이렇게하면 작동하는 드롭 다운 모양이 표시되지만 전달하려는 옵션 만 유효한 선택입니다.


3
이론적으로는 좋은 생각이지만 IE8 이전에는 IE에서 비활성화 된 옵션을 지원하지 않습니다. tinyurl.com/yle4bto
scunliffe

1

html 솔루션 :

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

자바 스크립트 것들 :

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

제거:

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

편집 : 제거 방법 추가


@ButtleButkus는 자바 스크립트가 작동합니까? 브라우저 관련 문제 일 수 있습니다. 요소에 tabindex를 추가하려고했습니다.
Kadmillos

1

양식을 제출하기 전에 disabled 속성을 제거하십시오.

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

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

disabled="disabled" ->데이터베이스에서 값을 가져 와서 양식에 표시합니다. readonly="readonly" ->선택 상자에서 값을 변경할 수 있지만 값을 데이터베이스에 저장할 수 없습니다.


잘못 저장되었습니다. '읽기 전용'속성이 모든 브라우저에서 처리되지 않아 신뢰할 수없는 것 같습니다.
richey

0

선택 드롭 다운이 출생 이후 읽기 전용이며 전혀 변경할 필요가 없다면 다른 컨트롤을 대신 사용해야합니까? 단순하고 <div>(숨겨진 양식 필드) 또는 <input type="text">?

추가 : 드롭 다운이 항상 읽기 전용이 아니며 JavaScript를 사용 / 사용하지 않도록 설정하는 경우 여전히 해결책입니다. 즉시 DOM을 수정하십시오.


처음부터 읽기 전용이 아닙니다. JavaScript를 사용하여 변경 및 업데이트합니다. 이전 드롭 다운에 특정 값이 있으면이 값은 읽기 전용이됩니다.
Jrgns

그렇다면이 드롭 다운을 텍스트 상자로 즉시 대체 할 수 있습니까?
Vilx-

그래, 그러나 항상 숨겨진 입력은 내 의견으로는 더 우아하다
Jrgns

0

아래는 나를 위해 일했습니다 :

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

11
참고 : 비활성화 된 양식 필드는 제출에 포함되지 않습니다.
mz_01

0

선택 상자를 숨기고 span정보 값으로 그 자리에 표시하여 관리했습니다 . .readonly수업 을 사용 중지하는 경우 .toVanish요소 를 제거 하고 표시해야 .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

IE에서는 두 번 클릭하여 onfocus => onblur 접근 방식을 물리 칠 수있었습니다. 그러나 가치를 기억하고 onchange 이벤트에서 복원하면 그 문제를 처리하는 것처럼 보입니다.

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

javascript 변수를 사용하여 expando 속성없이 유사한 작업을 수행 할 수 있습니다.


0

다음은 사용자 정의 jQuery 함수를 사용하여 기능을 달성하려는 시도입니다 (여기에서 언급 한 바와 같이).

$(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);

});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.