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


180

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

readonly属性仅适用于inputtextarea字段,但这基本上就是我想要的。有什么办法可以使它正常工作吗?

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

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

2
很抱歉加入晚了,但是trafalmadorian@workest 提供的解决方案是最好的。它禁用所有未选择的输入。如果选择启用了多个选项,它也将起作用。$('#toSelect')find(':not(:selected)').prop('disabled',true);
Abhishek Madhani 2014年

另外,您可以在UI上将控件保留为禁用状态,但可以在操作方法中检索该值:public ActionResult InsertRecord(MyType model){if(model.MyProperty == null){model.MyProperty = Request [“ MyProperty”]; }}
beastieboy

Answers:


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

现在,有了这个,我注意到根据您使用的Web服务器,您可能必须将hidden输入放在之前或之后<select>

如果我的记忆正确地为我服务,请使用IIS,然后再使用Apache。与往常一样,测试是关键。


3
这将如何依赖于Web 服务器?客户端不是通过选择字段呈现页面的,因此在发生类似冲突的情况下,客户端将决定是否将值发送到服务器?
Ilari Kajaste 2011年

8
这取决于服务器如何处理具有相同名称的多个输入。
乔丹·琼斯,

1
你最好不要依赖于特定的服务器类型,所以我认为第一种方法是清洁的,而且容易出错..少
卢克

5
@Jordan:浏览器不会将禁用的字段值发送到服务器,这就是为什么当您尝试在服务器端处理它们时它们为空的原因。如果您有一个具有所需值的隐藏字段,并且禁用了可见字段,则仅将隐藏字段发送到服务器。如此,仅当禁用可见字段并且没有优先级问题时,才应(通过JS或服务器端代码)创建隐藏字段。
马特·范·安德尔

1
仅当您需要一种无需javascript即可使用的表单时,这是唯一的选择。
安德鲁

224

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

jQuery代码:

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

15
很好的解决方案!
克里斯,

2
这是我确定的,主要是因为它不那么吸引人。
乔纳森(Jonathan)

3
jQuery docs建议使用.prop和.removeProp代替“ .attr”和“ .removeAttr”用于“选中”,“选定”和“禁用”,请参阅http://api.jquery.com/prop/
Jim Bergman

2
@JimBergman的评论的相关部分-“属性通常会在不更改序列化HTML属性的情况下影响DOM元素的动态状态。示例包括输入元素的value属性,输入和按钮的Disabled属性或复选框的checked属性。应该使用.prop()方法设置禁用和检查功能,而不是.attr()方法。应该使用.val()方法获取和设置值。” -从api.jquery.com/prop
约书亚舞

2
您是天才一人(Y)
TommyDo '16

13

我一直在寻找解决方案,因为我没有在该线程中找到解决方案,所以我自己做了。

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

很简单,您只需要在关注该字段时就对其进行模糊处理,例如禁用它,但实际上是在发送其数据。


哇,简单方便的解决方案。谢谢..我+1 :)
Naeem Ul Wahhab

我非常喜欢这个..根据表单中的交互,元素会前后启用/禁用...在这种情况下,如何重新启用“模糊”字段?
bkwdesign 2013年

通过谷歌搜索,看起来像$('#selectbox')。off('focus'); 会实现重新启用的技巧
bkwdesign 2013年

2
适用于文本框,不适用于选择框,以及通过单击并按住按钮即可轻松解决
Andrew

7

我面临的情况略有不同,因为我只希望不允许用户基于较早的选择框更改所选值。我最后要做的就是使用以下方式禁用选择框中的所有其他未选择的选项

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

谢谢,我发现您在逻辑上最简单。但是,attr如果更改为prop,则应类似于$('#toSelect')find(':not(:selected)').prop('disabled',true);
Abhishek Madhani 2014年

6

Tres建议的相同解决方案,无需使用jQuery

<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灵活。


但是,这对于多个选择器不是很好。也许我们可以使用getElementsByTagName('select')
幸运

6

它不能与:input选择器用于选择字段一起使用,请使用以下命令:

    jQuery(function() {

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

    });

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

4

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

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

然后以您的形式在此处调用它:

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

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


4

只需在提交前添加一行即可。

$(“#XYZ”)。removeAttr(“ disabled”);


2

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


2

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

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


2

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

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

'obj'参数必须是一个jquery对象
Doglas

1

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

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

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

-8

另一种选择是使用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


6
该控件未变灰,用户可以对其进行编辑。您无法阅读整个部分,而我引用:“以下元素支持readonly属性:INPUT和TEXTAREA。”
卡洛斯·雷登

3
我知道这是一个旧答案,但这确实有效。我不知道许多不赞成投票的原因。
Ze Luis
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.