jquery를 사용하여 드롭 다운을 읽기 전용으로 만드는 방법은 무엇입니까?


91

읽기 전용으로 만들기 위해 다음 문을 사용하고 있지만 작동하지 않습니다.

$('#cf_1268591').attr("readonly", "readonly"); 

나는 그것을 비활성화하고 싶지 않고 읽기 전용으로 만들고 싶습니다.


4
읽기 전용 드롭 다운과 표준 드롭 다운의 차이점은 무엇입니까?
Leo


이것이 정말로 jQuery 문제입니까? 아니면 드롭 다운이 읽기 전용 속성으로 작동하지 않을 수 있습니까?
Ilia G

Kanishka Panamaldeniya는 이미 정답을 제공했습니다 (댓글 대신 답으로 만들어야 함).
qbantek 2011

2
드롭 다운이 항상 읽기 전용은 아닙니다. 읽기 전용은 값을 볼 수 있지만 변경할 수 없음을 의미합니다.
Suncat2000 2013

답변:


182
$('#cf_1268591').attr("disabled", true); 

드롭 다운은 항상 읽기 전용입니다. 당신이 할 수있는 것은 그것을 비활성화하는 것입니다

양식으로 작업하는 경우 비활성화 된 필드는 제출되지 않으므로 숨겨진 필드를 사용하여 비활성화 된 드롭 다운 값을 저장합니다.


26
드롭 다운을 비활성화하면 제출되지 않습니다. 나는 당신의 해결책을 시도 할 것입니다.
Karim Ali

3
선택 (드롭 다운)을 비활성화 할 때의 한 가지 문제는 일부 브라우저 (예 : IE9)에서 포커스가 손실된다는 것입니다. 예를 들어 양식에서 사용자의 위치가 손실되어 ajax 호출이 처리되는 동안 select 요소가 비활성화되면 문제가 될 수 있습니다.
Chris

1
제안 해 주셔서 감사합니다. 그래도 질문입니다. 숨겨진 필드에 드롭 다운 값을 어떻게 저장합니까? 이에 대한 예제 코드가 있습니까?
kramer65 2014

2
또 다른 "해결 방법"은 양식 제출 전에 해당 필드를 활성화하는 것입니다. 또는 JSON 형식으로 데이터를 보낸 경우 (활성화, 데이터 가져 오기, 다시 비활성화) : var disabled = $ (yourform) .find ( ': input : disabled'). removeAttr ( 'disabled'); var data = getFormJSONData ($ (yourform)); disabled.attr ( '비활성화 됨', '비활성화 됨');
KDT

4
지금 사용해야합니다 prop().
alex

144

나는 같은 문제가 있었고 내 해결책은 선택되지 않은 모든 옵션을 비활성화하는 것이 었습니다. jQuery를 사용하면 매우 쉽습니다.

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

편집 => 같은 페이지에 여러 개의 드롭 다운이있는 경우 아래와 같이 select-ID에서 선택하지 않은 모든 옵션을 비활성화합니다.

$('#select_field_id option:not(:selected)').attr('disabled', true);

24
좋은 생각입니다! 현재 버전의 jQuery에서 모범 사례를 사용하려면 prop 메서드를 사용하여 비활성화 된 값을 설정합니다. 즉$('option:not(:selected)').prop('disabled', true);
Chris O'Connell

이것은 매우 재치있는 해결책입니다!
Jacques

1
예! 좋은 생각입니다.
에릭

1
이것은 n ° 1 대답이어야합니다.
Erwan Clügairtz

22

선택한 값을 비활성화하지 않고 이것을 시도하십시오 ..

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

저 한테 잘 맞아요 ..


귀하의 답변과 같은 줄을 따라 다른 옵션 $ ( '# cf_1268591 option : not (: selected)'). remove ();
Seth Winters

20

이것은 당신이 찾고있는 것입니다 :

$('#cf_1268591').attr("style", "pointer-events: none;");

매력처럼 작동합니다.


1
좋은 대답이지만 여전히 선택 항목을 탭할 수 있다는 점에 유의하십시오. 당신은 또한 설정해야합니다tabindex="-1"
uesports135

위대한 사람, 나는 이것이 필요합니다. 당신의 대답을 주셔서 감사합니다.
sina_Islam

13

로 요소를 설정하면 disabled데이터가 제출되지 않지만 select요소에는 readonly.

당신은을 시뮬레이션 할 수 있습니다 readonlyselect탭이 변화를 방지하기 위해 스타일과 JS을 위해 CSS를 사용하여 :

select[readonly] {
  background: #eee;
  pointer-events: none;
  touch-action: none;
}

그런 다음 다음과 같이 사용하십시오.

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

결과:


2
매우 멋진 접근 방식이지만 사용자는 여전히 키보드에서 TAB을 사용하여 값을 선택할 수 있습니다.
Ricardo Martins

1
@RicardoMartins의 덕분에, TAB과 변화를 방지하기 위해 답변을 업데이트
루카스 부스타

12

필드를 비활성화 할 것입니다. 그런 다음 양식을 제출할 때 비활성화하지 마십시오. 제 생각에 이것은 숨겨진 필드를 다루는 것보다 쉽습니다.

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

8

선택하지 않은 옵션을 제거하는 간단한 jquery.

$('#your_dropdown_id option:not(:selected)').remove();

또한 내 솔루션입니다. 그들을 비활성화시키는 것보다 낫습니다.
Gianluca Demarinis

6

작업을 단순화하기 위해 번거 로움없이이를 수행하는 jQuery 플러그인이 있습니다. https://github.com/haggen/readonly


훌륭한 (작은) 코드 스 니펫, 감사합니다. 드롭 다운을 비활성화하여 변경할 수는 없지만 해당 값을 제출할 수는 있습니다. 굉장히 유용하다.
Alex Hopkins

3

이 행은 readonly속성을 읽기 전용 으로 선택 합니다.

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

2

이 코드는 먼저 각 드롭 다운에 원래 선택을 저장합니다. 그런 다음 사용자가 선택을 변경하면 드롭 다운이 원래 선택으로 재설정됩니다.

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

2

나에게 가장 쉬운 옵션은 읽기 전용으로 선택하고 추가하는 것입니다.

onmousedown="return false" onkeydown="return false"

추가 로직을 작성할 필요가 없습니다. 숨겨진 입력이 없거나 비활성화 된 다음 양식 제출시 다시 활성화됩니다.


1

오래된 기사이지만 찾을 수있는 사람들에게 경고하고 싶습니다. 이름으로 요소가있는 비활성화 된 속성에주의하십시오. 이상하지만 너무 작동하지 않는 것 같습니다.

작동하지 않습니다.

<script language="JavaScript">
function onChangeFullpageCheckbox() {    
$('name=img_size').attr("disabled",$("#fullpage").attr("checked"));
</script>

이 일:

<script language="JavaScript">
function onChangeFullpageCheckbox() {    
$('#img_size').attr("disabled",$("#fullpage").attr("checked"));
</script>

예, 속성이 아닌 prop을 사용해야한다는 것을 알고 있지만, 적어도 지금은 이전 버전의 jquery로 인해 prop이 작동하지 않습니다. 이제 업데이트 할 수 없습니다. 이유를 묻지 마십시오. html 차이는 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()" />

...

스크립트에서 오류를 발견하지 못했고 이름이있는 버전에서는 콘솔에 오류가 없었습니다. 그러나 물론 그것은 코드에서 내 실수 일 수 있습니다.

보기 : Win 7 Pro의 Chrome 26

문법이 잘못되어 죄송합니다.


1

이 작업을 수행하는 더 좋은 방법은 CSS를 사용하여 포인터 이벤트를 제거하고 드롭 다운에서 불투명도를 수정하는 것입니다 (0.5 시도). 이렇게하면 사용자에게 정상적으로 비활성화 된 것처럼 보이지만 여전히 데이터를 게시합니다.

이것은 이전 버전과의 호환성에 몇 가지 문제가 있지만 성가신 비활성화 / 읽기 전용 문제를 해결하는 것보다 더 나은 옵션이라고 생각합니다.


이를 위해 필요한 CSS에 대해 자세히 설명해 주시겠습니까?
Cocowalla

1

또한 비활성화하고 제출 호출을 활성화하는 순간 활성화 할 수도 있습니다. 나는 가장 쉬운 방법이라고 생각한다 :)


1

아주 잘 작동합니다

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

이것으로 옵션을 볼 수 있지만 선택할 수 없습니다


0

읽기 전용 드롭 다운 같은 것은 없습니다. 할 수있는 일은 각 변경 후 수동으로 첫 번째 값으로 재설정하는 것입니다.

$("select").change(function(event) {
    $(this).val($(this).find("option").first().val());
});

http://jsfiddle.net/4aHcD/


3
현재 선택된 옵션이 다음 예와 같이 목록의 첫 번째가 아닌 경우 좋지 않습니다. jsfiddle.net/4aHcD/19
Homer

@Homer, 코드는 변경 후 재설정하기위한 것이며 그 효과로 작동합니다. 어떤 이유로 든 초기 값을 직접 변경하는 대신 처음에 실행하려면 이벤트를 선언 한 후 항상 다음 $("select").change()과 같이 jsfiddle.net/4aHcD/20
Alex Turpin

2
페이지가 처음로드 될 때 세 번째 항목이 선택되고 사용자가 두 번째 항목으로 변경하려고하면 코드가 선택 항목을 첫 번째 항목으로 변경합니다. 그렇게해서는 안된다고 생각합니다. 다음은 OP가 원했던 것의 예입니다. 드롭 다운은 사용자 상호 작용을 기반으로 선택한 값을 변경하지 않습니다. jsfiddle.net/4aHcD/22
Homer

내가 필요한 것과 OP가 요청한 것은 읽기 전용 으로 만드는 방법이었습니다 . 즉, 선택한 값을 볼 수 있지만 변경할 수는 없습니다. 즉, 디스플레이는 편집 할 수없는 편집 가능한 컨트롤의 모양을 모방합니다.
Suncat2000 2013

0

"keypress up"시 빈 문자열을 만드십시오.

Html은 다음과 같습니다.

<input id="cf_1268591" style="width:60px;line-height:16px;border:1px solid #ccc">

Jquery는 다음과 같습니다.

$("#cf_1268591").combobox({
  url:"your url",
  valueField:"id",
  textField:"text",
  panelWidth: "350",
  panelHeight: "200",
});

// 빈 문자열로 키업 후 확인

var tb = $("#cf_1268591").combobox("textbox");
  tb.bind("keyup",function(e){
  this.value = "";
});

0

이런 식으로 시도해 볼 수 있습니다

function myFunction()
{
   $("select[id^=myID]").attr("disabled", true);
   var txtSelect = $("select[id^=myID] option[selected]").text();
}

이렇게하면 드롭 다운의 첫 번째 값이 기본값으로 설정되고 읽기 전용으로 보입니다.


0

html5 지원 :

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

`


0

다음은 disabled 사용을 제안하는 다른 답변에 대한 약간의 변형입니다. "disabled"속성은 실제로 어떤 값도 가질 수 있지만 여전히 비활성화 할 수 있으므로 disabled = "readonly"와 같이 읽기 전용으로 설정할 수 있습니다. 이렇게하면 평소처럼 컨트롤이 비활성화되고 다음과 같은 CSS를 사용하여 일반 비활성화 된 컨트롤과 다른 스타일로 쉽게 스타일을 지정할 수 있습니다.

select[disabled=readonly] {
    .... styles you like for read-only
}

데이터가 포함되도록 제출하려면 다른 답변에 자세히 설명 된대로 숨겨진 필드를 사용하거나 제출하기 전에 활성화하십시오.


0

@Kanishka가 말했듯이 양식 요소를 비활성화하면 제출되지 않습니다. 이 문제에 대한 스 니펫을 만들었습니다. 선택 요소가 비활성화되면 숨겨진 입력 필드를 만들고 값을 저장합니다. 활성화되면 생성 된 숨겨진 입력 필드를 삭제합니다.

더 많은 정보

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>

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