如何使 html <select> 元素看起来像“禁用”,但传递值?

Posted

技术标签:

【中文标题】如何使 html <select> 元素看起来像“禁用”,但传递值?【英文标题】:How to make html <select> element look like "disabled", but pass values? 【发布时间】:2012-09-27 23:48:14 【问题描述】:

当我禁用一个

<select name="sel" disabled>
    <option>123</option>
</select>

元素,它没有传递它的变量。

如何使它看起来像禁用,但处于“正常”状态?

这是因为我有一个“选择”列表,有时其中一些只有一个值,所以用户应该明白它只有一个值而不点击它。

【问题讨论】:

他们只关注元素,看到单个选项然后接受只有一个选项还不够吗?如果他们不能对元素做任何事情,只需使用带有readonly 属性的常规input 或隐藏输入。 如果它只有一个选项,为什么它需要在表单中?另外,请注意,不知情的用户将能够轻松更改选择值。 @WebnetMobile.com:我很高兴,但不知道是什么 @EL2002,听起来您正在依靠表单来返回您需要的特定值。您是否认为用户可以在该 有时 OP 的请求是完全可取的行为。例如。当通常有许多选项可用时,但表单上其他选项的某些组合仅允许 1 个特定选项。选择该选项并禁用该控件将远远优于其他 javascript 恶作剧。 【参考方案1】:

如果您不想添加 attr disabled 可以通过编程方式完成

可以使用以下代码将版本禁用到&lt;select class="yourClass"&gt; 元素中:

//bloqueo selects
  //block all selects
  jQuery(document).on("focusin", 'select.yourClass', function (event) 
    var $selectDiabled = jQuery(this).attr('disabled', 'disabled');
    setTimeout(function() $selectDiabled.removeAttr("disabled"); , 30);
  );

如果你想试试,可以在这里看到:https://jsfiddle.net/9kjqjLyq/

【讨论】:

【参考方案2】:

我的解决方案是在 CSS 中创建一个禁用的类:

.disabled 
    pointer-events: none;
    cursor: not-allowed;

然后您的选择将是:

<select name="sel" class="disabled">
    <option>123</option>
</select>

用户将无法选择任何值,但选择值仍会在表单提交时传递。

【讨论】:

这样您仍然可以使用 TAB 导航到选择,然后使用键盘上/下箭头键更改其选择的选项。 另外IE不支持pointer-events,你还是可以用鼠标导航的。【参考方案3】:

哇,我遇到了同样的问题,但是一行代码解决了我的问题。我写了

$last_child_topic.find( "*" ).prop( "disabled", true );
$last_child_topic.find( "option" ).prop( "disabled", false );   //This seems to work on mine

我将表单发送到一个 php 脚本,然后它打印每个选项的正确值,而它之前是“null”。

告诉我这是否可行。我想知道这是否只对我有效。

【讨论】:

【参考方案4】:

可以使用与禁用列表具有相同名称和值的附加隐藏输入元素。这将确保在 $_POST 变量中传递值。

例如:

<select name="sel" disabled><option>123</select>
<input type="hidden" name="sel" value=123>

【讨论】:

这不是一个解决方案,但它是一个替代方案。【参考方案5】:
<select id="test" name="sel">
  <option disabled>1</option>
  <option disabled>2</option>
</select>   

或者你可以使用 jQuery

$("#test option:not(:selected)").prop("disabled", true);

【讨论】:

这要好得多,因为它不需要在提交之前取消设置禁用。 注意,您需要在设置属性之前添加.not(":selected"),以保持选中项处于启用状态。【参考方案6】:

如果您可以为您的选择提供默认值,那么您可以对未选中的复选框使用相同的方法,这需要在实际元素之前隐藏输入,因为如果未选中,这些复选框不会发布值:

<input type="hidden" name="myfield" value="default" />
<select name="myfield">
    <option value="default" selected="selected">Default</option>
    <option value="othervalue">Other value</option>
    <!-- ... //-->
</select>

如果选择被 javascript(或 jQuery)禁用,或者即使您的代码编写 html 使用属性禁用元素本身,这实际上将发布值“默认”(显然不带引号): disabled="disabled" .

【讨论】:

认为这是对已接受答案的更好解决方案.. 有没有人对此有任何反对意见?【参考方案7】:

您可以根据需要将其保持禁用状态,然后在提交表单之前删除 disabled 属性。

$('#myForm').submit(function() 
    $('select').removeAttr('disabled');
);

请注意,如果您依赖此方法,您还需要以编程方式禁用它,因为如果 JS 被禁用或不受支持,您将被禁用选择卡住。

$(document).ready(function() 
    $('select').attr('disabled', 'disabled');
);

【讨论】:

这似乎是唯一的解决方案。 @EL2002 如果您真的对仅包含一个选项的选择行为不满意,那么我能想象的唯一其他解决方案就是使用 CSS 来模仿禁用的外观,正如 Praveen 建议的那样 禁用后,用户将无法提交数据。你这样好吗? 在提交表单时包含禁用的表单字段是严格违反 HTML 标准的 @EL2002 我不关注。上面的解决方案应该工作得很好。【参考方案8】:

添加一个类.disabled并使用这个CSS

​.disabled border: 1px solid #999; color: #333; opacity: 0.5;
.disabled option color: #000; opacity: 1;​

演示:http://jsfiddle.net/ZCSRq/

【讨论】:

Praveen,thanx,我已经试过了,很方便,但是“select”有打开列表的箭头,在禁用状态下是灰色的。并且未启用。 对不起,我的错。更新了@EL2002的答案请看一下。 谢谢,但它看起来不像已禁用,抱歉 =(

以上是关于如何使 html <select> 元素看起来像“禁用”,但传递值?的主要内容,如果未能解决你的问题,请参考以下文章

jquery如何点击页面,使select 的下拉框自动弹出?

如何使 <select> 的第一个选项不使用 jquery 向上移动? [关闭]

我如何使 PHP/HTML 图像在点击时显示原始大小?

通过Mysql Select标记使您的表颜色不同

<select>控件中,选中第一个值是不会触发onchange事件的,如何使选中第一值可以触发事件呢?

如何把html的select控件的下拉箭头改成图