【问题标题】:Default text which won't be shown in drop-down list不会在下拉列表中显示的默认文本
【发布时间】:2012-02-25 19:07:40
【问题描述】:

我有一个select,它最初会显示选择语言,直到用户选择一种语言。当用户打开选择时,我不希望它显示 Select language 选项,因为它不是实际选项。

我怎样才能做到这一点?

【问题讨论】:

    标签: html html-select


    【解决方案1】:

    Kyle's solution 对我来说工作得非常好,所以我进行了研究以避免任何 Js 和 CSS,但只是坚持使用 HTML。 将selected 值添加到我们希望作为标题出现的项目会强制它首先显示为占位符。 比如:

    <option selected disabled>Choose here</option>
    

    完整的标记应遵循以下原则:

    <select>
        <option selected disabled>Choose here</option>
        <option value="1">One</option>
        <option value="2">Two</option>
        <option value="3">Three</option>
        <option value="4">Four</option>
        <option value="5">Five</option>
    </select>
    

    你可以看看这个fiddle,结果如下:

    如果您希望在用户单击选择框后出现在选项中列出的占位符文本,只需添加 hidden 属性,如下所示:

    <select>
        <option selected disabled hidden>Choose here</option>
        <option value="1">One</option>
        <option value="2">Two</option>
        <option value="3">Three</option>
        <option value="4">Four</option>
        <option value="5">Five</option>
    </select>
    

    查看fiddle here 和下面的屏幕截图。

    【讨论】:

    • 这是一个很好的答案,但是当使用 Angular JS 时,它不起作用,因为 Angular 会自动添加一个空选项并将其设置为默认值
    • 无论如何,仅供参考,这是您在 Angular 中的做法,只需将上述方法与此处解释的 Angular 特定方法结合起来即可metaltoad.com/blog/…
    • 请注意,上述答案中使用的the hidden attribute 是一个可以在任何HTML 元素上设置的属性,并且通常(但不一定)实现等同于设置display: none CSS。
    • 另请注意,在option 上设置hiddenselect 中在iOS 或Mac 上的Safari 中不起作用。因此,此答案仅提供部分浏览器支持。
    • 这太美了!
    【解决方案2】:

    解决办法如下:

    <select>
        <option style="display:none;" selected>Select language</option>
        <option>Option 1</option>
        <option>Option 2</option>
    </select>
    

    【讨论】:

    • 请注意selected="true" 无效。相反,在 (X)HTML 中使用 selected="selected" 或在 HTML 中仅使用 selected。看来您将selected 属性与selected 属性混淆了,更改如下:myOption.selected = true;myOption.selected = false;
    • "display: none" 会被使用设备原生选择(如 Android 和 iOS)的浏览器忽略。您必须从 select.focus 中的 DOM 中删除该选项并将其返回并在 select.blur 中选择它以使其工作。
    • -1;像Nobita's answer using hidden (无论如何都是"typically implemented in CSS" 使用display: none),在option 上使用display: none 在Safari 中不起作用;该选项仍然出现。
    【解决方案3】:

    正确的语义方式是使用placeholder label option

    • 添加一个option 元素作为select 的第一个子元素
    • value= ""设置为option
    • 将占位符文本设置为option的内容
    • required 属性添加到select

    这将迫使用户选择另一个选项以便能够提交表单,并且浏览器应根据需要renderoption

    如果选择元素包含占位符标签选项,则用户 代理应以传达该选项的方式呈现该选项 它是一个标签,而不是控件的有效选项。

    但是,大多数浏览器会将其呈现为普通的option。所以我们必须手动修复它,将以下内容添加到option

    select > .placeholder {
      display: none;
    }
    <select required>
      <option class="placeholder" selected disabled value="">Select language</option>
      <option>Option 1</option>
      <option>Option 2</option>
    </select>

    【讨论】:

    • 应该注意的是,即使是这个(这是这里所有答案中解决这个问题的最彻底的尝试)也不能在 Safari 上运行,无论是在 iOS 还是 Mac 上。打开选择时该选项仍将保留。
    • @MarkAmery 我建议您喜欢它在@Nobita 答案中提出的建议,只需将hidden 属性添加到占位符选项标签而不是display: none,因为似乎大多数移动浏览器都会忽略@987654349 @CSS 属性,我认为它在语义上更正确。
    • @Gaboik1 在该答案的 cmets 中,我注意到 hidden 通常在底层实现为 display: none (并且规范明确建议这是“典型”实现)。因此,如果有任何浏览器 - 移动或其他 - hidden 工作但 display: none 没有工作,我会感到惊讶。你能举个例子吗?
    【解决方案4】:

    因为您不能为select 标签使用分配占位符,所以我认为没有任何方法可以完全按照您的要求使用纯 HTML/CSS。但是,您可以执行以下操作:

    <select>
      <option disabled="disabled">Select language</option>
      <option>Option 1</option>
    </select>
    

    “选择语言”将显示在下拉菜单中,但一旦选择了另一个选项,将无法重新选择它。

    希望对你有帮助。

    【讨论】:

    • 我发现最好的组合是 disabled 和 selected with style="display:none;"。 disabled 在您想要执行验证时很有用 - 它确保您没有默认选择启用的选项。
    • -1 因为这里的其他答案(尤其是 Nobtia 和 Oriol 的)提供了更多解释性细节和更完整的解决方案。
    【解决方案5】:

    试试这个:

    <div class="selectSelection">
        <select>
            <option>Do not display</option>
            <option>1</option>
            <option>1</option>
        </select>
    </div>
    

    在 CSS 中:

    .selectSelection option:first-child{
        display:none;
    }
    

    【讨论】:

    • 这个答案不包含其他答案也不包含更详细的内容,而且格式错误; -1.
    【解决方案6】:

    我有一个解决方案,其跨度显示在选择上方,直到选择完成。 span 显示默认消息,因此不在命题列表中:

    HTML:

    <span id="default_message_overlay">Default message</span>
    <select id="my_select">
        <option value="1">Option 1</option>  
        <option value="2">Option 2</option>
        <option value="3">Option 3</option>
    </select>
    

    CSS:

    #default_message_overlay {
        position: absolute;
        display: block;
        width: 120px;
        color: grey;
    }
    select {
        width: 150px;
    }
    

    Javascript(使用 JQuery):

    $(document).ready(function() {
        // No selection at start
        $('#my_select').prop("selectedIndex", -1);
    
        // Set the position of the overlay
        var offset = $('#my_select').offset();
        offset.top += 3;
        offset.left += 3;
        $('#default_message_overlay').offset(offset);
    
        // Remove the overlay when selection changes
        $('#my_select').change(function() {
            if ($(this).prop("selectedIndex") != -1) {
                $('#default_message_overlay').hide();
            }
        });
    });
    

    我创建了一个jsfiddle for demo。用 Firefox 和 IE8 测试。

    【讨论】:

    • OSX 上的 Chrome 总是显示选择的第一个选项,但它似乎是特定于 OSX 的,因为此处提供的所有解决方案都会导致选择第一个可见选项。
    • 而不是span 使用legend,那将是完美的或label
    • 这是一种有趣的方法,也是我看到的让这种行为在 Safari 上工作的唯一可能方法,但在这里实现得很糟糕;您至少需要在您的跨度上使用pointer-events: none 才能允许点击通过以进行选择。
    【解决方案7】:
    <option value="" id="ddl" name="prop" style="display:none;" disabled selected>chose something </option>
    

    如果需要,您当然可以将 css 移动到 css 文件中,并放置一个脚本来捕获 esc 按钮以再次选择禁用。与我提出的value="" 的其他类似答案不同,如果您使用表单发送选择列表的值,它将不包含“选择某些东西”。在使用var obj = { prop:$('#ddl').val(),...};JSON.stringify(obj); 编译为json 发送的asp.net mvc 5 中,prop 的值将为null。

    【讨论】:

      【解决方案8】:

      Op1:

      $("#MySelectid option").each(function () {
              if ($(this).html() == "text to find") {
                  $(this).attr("selected", "selected");
                  return;
              }
      });
      

      操作2:

      $('#MySelectid option')
      .filter(function() { return $.trim( $(this).text() ) == 'text to find'; })​​​​​​​​.attr('selected','selected');​​​​​​​
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多