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

Mar*_*ang 172 html javascript css forms html-select

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

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

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

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

Tre*_*res 218

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

jQuery代码:

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

  • 相当不错的解决方案! (13认同)
  • jQuery文档建议使用.prop和.removeProp代替'checked','selected'和'disabled'而不是.attr和.removeAttr [请参阅http://api.jquery.com/prop/](http://api. jquery.com/prop/) (3认同)
  • 该死的太棒了! (2认同)
  • 这是我定居的那个,主要是因为它是最不突兀的. (2认同)
  • @ JimBergman评论的相关部分 - "属性通常会影响DOM元素的动态状态,而不会更改序列化的HTML属性.例如输入元素的value属性,输入和按钮的disabled属性,或复选框的checked属性.应该使用.prop()方法来设置disabled和checked而不是.attr()方法.应该使用.val()方法来获取和设置值." - 来自http://api.jquery.com/prop/ (2认同)
  • 你是天才之一(Y) (2认同)
  • 这是我所知道的最不可思议的技巧之一。完美运行。谢谢。 (2认同)
  • 我喜欢这个解决方案,但请注意,如果用户随后使用浏览器的后退按钮返回表单,控件将不再被禁用。 (2认同)

Jor*_*nes 114

<select disabled="disabled">
    ....
</select>
<input type="hidden" name="select_name" value="selected value" />
Run Code Online (Sandbox Code Playgroud)

select_name您通常会给出的名称在哪里<select>.

另外一个选项.

<select name="myselect" disabled="disabled">
    <option value="myselectedvalue" selected="selected">My Value</option>
    ....
</select>
<input type="hidden" name="myselect" value="myselectedvalue" />
Run Code Online (Sandbox Code Playgroud)

现在有了这个,我注意到,根据您使用的是什么网络服务器,您可能必须在hidden输入之前或之后输入<select>.

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

  • 这取决于服务器如何处理具有相同名称的多个输入. (8认同)
  • @Jordan:浏览器不会向服务器发送禁用的字段值,这就是为什么当你尝试在服务器端处理它们时它们是空的.如果您有一个具有所需值的隐藏字段,并且禁用了可见字段,则只会将隐藏字段发送到服务器.因此,只有在可见字段被禁用且没有优先级问题时,才应创建隐藏字段(通过JS或服务器端代码). (4认同)
  • 这将如何依赖于web*服务器?*是不是使用select字段呈现页面的*client*,因此如果发生冲突,则*client*决定是否发送服务器的价值与否? (3认同)
  • 如果您需要一个无需 JavaScript 的表单,那么这是唯一的选择。 (2认同)

Jea*_*eau 13

我一直在寻找一个解决方案,因为我没有在这个线程中找到解决方案,我自己做了.

// With jQuery
$('#selectbox').focus(function(e) {
    $(this).blur();
});
Run Code Online (Sandbox Code Playgroud)

很简单,当你专注于它时,你只是模糊了字段,比如禁用它,但实际上你发送了它的数据.

  • 适用于文本框,不适用于选择框,并且通过单击并按住按钮超级容易解决 (2认同)

tra*_*ian 7

我遇到了一个稍微不同的场景,因为我只是想不允许用户根据之前的选择框更改所选值.我最终做的只是禁用选择框中的所有其他未选择的选项

$('#toSelect')find(':not(:selected)').attr('disabled','disabled');
Run Code Online (Sandbox Code Playgroud)


Mar*_*aio 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>
Run Code Online (Sandbox Code Playgroud)

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


小智 6

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

    jQuery(function() {

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

    });
Run Code Online (Sandbox Code Playgroud)


小智 5

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

function enablePath() {
    document.getElementById('select_name').disabled= "";
}
Run Code Online (Sandbox Code Playgroud)

你在这里以你的形式调用它:

<form action="act.php" method="POST" name="form_name" onSubmit="enablePath();">
Run Code Online (Sandbox Code Playgroud)

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


小智 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');
});
Run Code Online (Sandbox Code Playgroud)