如何使用jQuery将下拉列表设为只读?


91

我正在使用以下语句将其设置为只读,但无法正常工作。

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

我不想禁用它,我想使其只读。


4
只读下拉列表和标准下拉列表有什么区别?
Leo


这真的是jQuery问题吗?还是下拉菜单不适用于readonly属性?
Ilia G

Kanishka Panamaldeniya已经为您提供了正确的答案(应以答案代替评论)。
qbantek

2
下拉列表并不总是只读的。只读意味着您可以看到它的值,但是不能更改它。
Suncat2000

Answers:


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

下拉菜单始终是只读的。你可以做的就是禁用它

如果您使用表单,则禁用字段不会提交,因此请使用隐藏字段存储禁用下拉列表值


26
禁用下拉菜单不会提交。我将尝试您的解决方案。
卡里姆·阿里

3
禁用选择(下拉)的一个问题是在某些浏览器(例如IE9)中失去了焦点。如果在处理ajax调用时禁用了select元素,例如,由于用户在表单中的位置丢失,则可能会出现问题。
克里斯,

1
感谢您的建议。不过只是一个问题;如何将下拉值存储在隐藏字段中?您会为此提供一些示例代码吗?
kramer65

2
另一个“解决方法”是在提交表单之前启用这些字段。或者在我以JSON格式发送数据的情况下(启用,获取数据,再次禁用):var disabled = $(您的表单).find(':input:disabled')。removeAttr('disabled'); var data = getFormJSONData($(yourform)); disable.attr('disabled','disabled');
KDT 2014年

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);
克里斯·奥康奈尔

这是一个非常机智的解决方案!
雅克

1
是!好想法。
埃里克(Eric)

1
这应该是n°1个答案。
ErwanClügairtz19年

22

尝试此一项..而不禁用所选值。

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

这个对我有用..


与您的回答相同,我删除了其他选项$('#cf_1268591 option:not(:selected)')。remove();
塞斯·温特斯

20

这是您要寻找的:

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

奇迹般有效。


1
很好的答案,但是请注意,这仍然允许选择选项卡。您还需要设置tabindex="-1"
uesports135 '17

伟人,我需要这个,因为残疾人没有映射到模型,谢谢您的回答。
sina_Islam

13

将设置为disabled不会提交数据,但是select则没有readonly

你可以模拟readonlyselect使用CSS样式和JS防止改变与标签:

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键选择一个值。
里卡多·马丁斯

1
@RicardoMartins谢谢,更新了答案以防止使用TAB进行更改
Lucas Bustamante

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



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

对我来说,最简单的选择是将select设为只读并添加:

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而不是attr,但至少由于旧版本的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 2015年

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
亚历克斯·图尔平

2
首次加载页面时,如果选择了第三项,并且用户尝试将其更改为第二项,则您的代码会将选择内容更改为第一项。我认为它不应该这样做。以下是我认为OP想要的示例,一个不会根据用户交互更改其选定值的下拉列表:jsfiddle.net/4aHcD/22
Homer

我需要和OP要求的是使其变为只读的方式。这意味着您可以看到一个或多个选定的值,但是无法更改。这意味着显示模仿了可编辑控件的外观而无法对其进行编辑。
Suncat2000

0

尝试在“按键”时制作空字符串

该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",
});

//使用空字符串在keyup之后进行

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

这与建议使用禁用的其他答案略有不同。由于“ disabled”属性实际上可以具有任何值并且仍然禁用,因此您可以将其设置为readonly,例如disabled =“ readonly”。这将像往常一样禁用该控件,并且还允许您使用CSS像常规禁用的控件一样轻松地设置其样式,例如:

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

如果要提交的数据包括在内,请使用隐藏字段或在提交前启用,如其他答案所述。


0

正如@Kanishka所说,如果我们禁用一个form元素,它将不会被提交。我已经为这个问题创建了一个片段。禁用select元素时,它将创建一个隐藏的输入字段并存储值。启用后,它将删除创建的隐藏输入字段。

更多信息

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>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.