如何确保<select>表单字段在被禁用时提交?</select>

时间:2009-07-27 23:01:59

标签: javascript html css forms html-select

我有一个select表单字段,我想将其标记为“只读”,因为用户无法修改该值,但该值仍然随表单一起提交。使用disabled属性可防止用户更改值,但不会使用表单提交值。

readonly属性仅适用于inputtextarea字段,但这基本上就是我想要的。有没有办法让它发挥作用?

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

  • 不是禁用select,而是禁用所有option并使用CSS将选区灰显,使其看起来像已禁用。
  • 向提交按钮添加点击事件处理程序,以便在提交表单之前启用所有已禁用的下拉菜单。

15 个答案:

答案 0 :(得分:214)

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

jQuery代码:

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

答案 1 :(得分:113)

<select disabled="disabled">
    ....
</select>
<input type="hidden" name="select_name" value="selected value" />

select_name是您通常会提供<select>的名称。

另一种选择。

<select name="myselect" disabled="disabled">
    <option value="myselectedvalue" selected="selected">My Value</option>
    ....
</select>
<input type="hidden" name="myselect" value="myselectedvalue" />

现在有了这个,我注意到,根据您使用的网络服务器,您可能需要在hidden之前或之后添加<select>输入。

如果我的记忆正确地为我服务,使用IIS,你把它放在之前,用Apache把它放在后面。一如既往,测试是关键。

答案 2 :(得分:12)

我一直在为此寻找解决方案,因为我没有在这个帖子中找到解决方案,所以我自己做了。

// With jQuery
$('#selectbox').focus(function(e) {
    $(this).blur();
});

很简单,你只需要在关注它时模糊字段,比如禁用它,但实际上是发送数据。

答案 3 :(得分:6)

它不适用于选择字段的:input选择器,请使用:

    jQuery(function() {

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

    });

答案 4 :(得分:6)

我遇到了一个稍微不同的场景,因为我只想让用户不能根据之前的选择框更改所选值。我最终做的只是使用

禁用选择框中的所有其他未选择的选项
$('#toSelect')find(':not(:selected)').attr('disabled','disabled');

答案 5 :(得分:5)

不使用jQuery

Same solution suggested by Tres

<form onsubmit="document.getElementById('mysel').disabled = false;" action="..." method="GET">

   <select id="mysel" disabled="disabled">....</select>

   <input name="submit" id="submit" type="submit" value="SEND FORM">
</form>

这可能有助于人们理解更多,但显然不如jQuery那么灵活。

答案 6 :(得分:5)

我在选择中使用下一代码禁用选项

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

答案 7 :(得分:4)

只需在提交前添加一行。

  

  $( “#XYZ”)removeAttr( “无效”);

答案 8 :(得分:3)

我找到的最简单方法是创建一个与您的表单相关的微小javascript函数:

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

你在这里用你的表格来表达:

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

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

答案 9 :(得分:2)

或使用一些JavaScript更改选择的名称并将其设置为禁用。这样,仍然会提交选择,但使用您未检查的名称。

答案 10 :(得分:1)

我找到了一个可行的解决方案:删除除选定元素之外的所有元素。然后,您可以将样式更改为看起来已禁用的内容。 使用jQuery:

jQuery(function($) {
    $('form').submit(function(){
        $('select option:not(:selected)', this).remove();
    });
});

答案 11 :(得分:1)

我发了一个快速(仅限Jquery)插件,在输入被禁用时将值保存在数据字段中。 这只是意味着只要通过jquery使用.prop()或.attr()以编程方式禁用该字段...然后通过.val(),. serialIize()或.serializeArra()访问该值将始终返回即使被禁用也是如此:)

无耻的插件:https://github.com/Jezternz/jq-disabled-inputs

答案 12 :(得分:1)

基于Jordan的解决方案,我创建了一个自动创建隐藏输入的函数,该输入具有相同的名称和您想要变为无效的选择的相同值。第一个参数可以是id或jquery元素;第二个是布尔值可选参数,其中&#34; true&#34;禁用和&#34; false&#34;启用输入。如果省略,则第二个参数在&#34;启用&#34;之间切换选择。和&#34;禁用&#34;。

function changeSelectUserManipulation(obj, disable){
    var $obj = ( typeof obj === 'string' )? $('#'+obj) : obj;
    disable = disable? !!disable : !$obj.is(':disabled');

    if(disable){
        $obj.prop('disabled', true)
            .after("<input type='hidden' id='select_user_manipulation_hidden_"+$obj.attr('id')+"' name='"+$obj.attr('name')+"' value='"+$obj.val()+"'>");
    }else{
        $obj.prop('disabled', false)
            .next("#select_user_manipulation_hidden_"+$obj.attr('id')).remove();
    }
}

changeSelectUserManipulation("select_id");

答案 13 :(得分:0)

<select id="example">
    <option value="">please select</option>
    <option value="0" >one</option>
    <option value="1">two</option>
</select>



if (condition){
    //you can't select
    $("#example").find("option").css("display","none");
}else{
   //you can select
   $("#example").find("option").css("display","block");
}

答案 14 :(得分:-7)

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

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

如果仍然提交了值,则输入字段将显示为灰色,用户无法对其进行编辑。

编辑:

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

  • 只读元素获得焦点,但用户无法修改。
  • 只读元素包含在标签导航中。
  • 只读元素可能会成功。

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