我有一个选择表单字段,我想标记为“readonly”,因为用户不能修改该值,但该值仍然与表单一起提交。使用disabled属性可以防止用户更改值,但不会将值与表单一起提交。

readonly属性仅适用于输入和文本区域字段,但这基本上是我想要的。有办法让它工作吗?

我考虑的两种可能性包括:

不是禁用选择,而是禁用所有选项,并使用CSS将选择变成灰色,这样它看起来就像禁用了一样。 向提交按钮添加单击事件处理程序,以便在提交表单之前启用所有禁用的下拉菜单。


当前回答

我发现最简单的方法是创建一个小的javascript函数绑定到你的表单:

function enablePath() {
    document.getElementById('select_name').disabled= "";
}

你在这里的表格中称它为

<form action="act.php" method="POST" name="form_name" onSubmit="enablePath();">

或者你可以在你用来检查你的表单的函数中调用它:)

其他回答

另一种选择是使用readonly属性。

<select readonly="readonly">
    ....
</select>

对于readonly,值仍然被提交,输入字段是灰色的,用户不能编辑它。

编辑:

引自http://www.w3.org/TR/html401/interact/forms.html#adef-readonly:

只读元素接收焦点,但用户不能修改。 选项卡导航中包含只读元素。 只读元素可能会成功。

当它说元素可能成功时,这意味着它可能被提交,如这里所述:http://www.w3.org/TR/html401/interact/forms.html#successful-controls

我遇到了一个略有不同的场景,在这种场景中,我只想不允许用户根据先前的选择框更改所选值。我最终所做的只是禁用所有其他非选择选项在选择框使用

$('#toSelect').find(':not(:selected)').prop('disabled',true);

对于选择字段,它不能使用:input选择器,使用这个:

    jQuery(function() {

    jQuery('form').bind('submit', function() {
        jQuery(this).find(':disabled').removeAttr('disabled');
    });

    });

禁用字段,然后在表单提交之前启用它们:

jQuery代码:

jQuery(function ($) {        
  $('form').bind('submit', function () {
    $(this).find(':input').prop('disabled', false);
  });
});

我使用next代码禁用选择中的选项

<select class="sel big" id="form_code" name="code" readonly="readonly">
   <option value="user_played_game" selected="true">1 Game</option>
   <option value="coins" disabled="">2 Object</option>
   <option value="event" disabled="">3 Object</option>
   <option value="level" disabled="">4 Object</option>
   <option value="game" disabled="">5 Object</option>
</select>

// Disable selection for options
$('select option:not(:selected)').each(function(){
 $(this).attr('disabled', 'disabled');
});