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

IT技术 javascript html css forms html-select
2021-01-18 05:03:49

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

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

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

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

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

jQuery代码:

jQuery(function ($) {        
  $('form').bind('submit', function () {
    $(this).find(':input').prop('disabled', false);
  });
});
这是我选择的一个,主要是因为它最不引人注目。
2021-03-21 05:03:49
@JimBergman 评论的相关部分 - “属性通常会影响 DOM 元素的动态状态,而不更改序列化的 HTML 属性。示例包括输入元素的 value 属性、输入和按钮的禁用属性或复选框的选中属性。 .prop() 方法应该用于设置禁用和检查,而不是 .attr() 方法。应该使用 .val() 方法获取和设置值。” - 来自api.jquery.com/prop
2021-04-05 05:03:49
这是我所知道的最不可思议的技巧之一。完美运行。谢谢。
2021-04-09 05:03:49
你是天才之一(Y)
2021-04-11 05:03:49
jQuery 文档建议将 .prop 和 .removeProp 用于“checked”、“selected”和“disabled”,而不是 .attr 和 .removeAttr参见 http://api.jquery.com/prop/
2021-04-13 05:03:49
<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 放在后面。一如既往,测试是关键。

这取决于服务器如何处理具有相同名称的多个输入。
2021-03-19 05:03:49
这将如何依赖于 Web服务器?不是客户端使用选择字段呈现页面,因此在发生类似冲突的情况下,客户端将决定是否将值发送到服务器?
2021-03-31 05:03:49
你最好不要依赖特定的服务器类型,所以我认为第一种方法更干净,更不容易出错。
2021-04-01 05:03:49
@Jordan:浏览器不会将禁用的字段值发送到服务器,这就是为什么当您尝试在服务器端处理它们时它们是空的。如果您有一个具有所需值的隐藏字段,并且可见字段被禁用,则只有隐藏字段将被发送到服务器。因此,只有当可见字段被禁用并且没有优先级问题时,才应该创建隐藏字段(通过 JS 或服务器端代码)。
2021-04-02 05:03:49
如果您需要一个无需 javascript 即可工作的表单,这只是一个选项。
2021-04-11 05:03:49

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

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

很简单,当你专注于它时,你只是模糊了这个领域,就像禁用它一样,但你实际上发送了它的数据。

哇 伟大而简单的解决方案。谢谢..+1 :)
2021-03-31 05:03:49
我非常喜欢这个......根据我表单中的交互,元素来回启用/禁用......如何在这种情况下重新启用“模糊”字段?
2021-03-31 05:03:49
从谷歌搜索,看起来像 $('#selectbox').off('focus'); 会做重新启用的伎俩
2021-04-03 05:03:49
适用于文本框,不适用于选择框,此外通过单击并按住按钮非常容易绕过
2021-04-07 05:03:49

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

$('#toSelect')find(':not(:selected)').prop('disabled',true);
谢谢,我发现你的逻辑最简单。但是attr应该改变为prop,看起来像$('#toSelect')find(':not(:selected)').prop('disabled',true);
2021-04-03 05:03:49

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

    jQuery(function() {

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

    });