默认文本不会显示在下拉列表中


107

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

我该如何实现?

Answers:


214

凯尔(Kyle)的解决方案对我来说非常完美,因此我进行了研究,以避免使用任何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>

您可以看一下这个小提琴,结果如下:

在此处输入图片说明

如果您希望在用户单击选择框后在选项中列出占位符文本,只需添加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>

检查小提琴这里和下面的截图。

在此处输入图片说明


这是一个很好的答案,但是当使用Angular JS时,它将不起作用,因为Angular会自动添加一个空选项并将其设置为默认选项
Dennis Wanyonyi

无论如何,仅供参考,这是您在Angular中要做的事情,只需将上述方法与此处说明的Angular具体方法结合起来即可metaltoad.com/blog/…–
Nobita

注意,hidden属性在上面的应答所使用的,是实现为等效于设置可以在任何HTML元素上进行设置,并且通常(但不是必须)的属性display: none与CSS。
Mark Amery

2
还要注意的是设置hiddenoptionselect不不工作在Safari中,在任的iOS或Mac。因此,此答案仅提供部分浏览器支持。
Mark Amery

1
这很漂亮!
Fibo Kowalsky '19

59

解决方法如下:

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

5
注意这selected="true"是无效的。而是selected="selected"在(X)HTML中或仅selected在HTML中使用。看来您将selected属性与selected属性混淆了,属性是这样改变的:myOption.selected = true;myOption.selected = false;
Oriol 2014年

2
使用设备本机选择(如Android和iOS)的浏览器将忽略“显示:无”。您必须从select.focus中的DOM中删除该选项,然后将其返回并在select.blur中将其选中,以使其起作用。
Radek Pech 2014年

-1; 像大雄的答案使用hidden(这是“典型的CSS实施的”使用display: none反正),使用display: none上的option不工作在Safari; 该选项仍会出现。
Mark Amery

49

正确的语义方式是使用占位符标签选项

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

这将迫使用户以选择另一个选项,以便能够提交表单,和浏览器应该呈现option根据需要:

如果select元素包含占位符标签选项,则预期用户代理以传达其为标签而非控件的有效选项的方式呈现该选项。

但是,大多数浏览器会将其呈现为normal 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)上也不起作用。打开选择后,该选项仍将保留。
Mark Amery

@MarkAmery我建议您喜欢@Nobita答案中提出的建议,只需将hidden属性添加到占位符选项标签中,而不是display: none像大多数移动浏览器忽略display: noneCSS属性那样,从我看来,它在语义上更加正确。
Gaboik18年

@ Gaboik1在对该答案的评论中,我注意到它hidden通常是display: none在幕后实现的(规范明确建议将此作为“典型”实现)。因此,如果有任何浏览器(移动版或其他浏览器)在hidden运行但display: none没有运行,我会感到惊讶。你能提供任何例子吗?
马克·阿默里'18

21

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

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

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

希望对您有所帮助。


2
我发现最好的方法是使用style =“ display:none;”禁用和选择的组合。当您要执行验证时,禁用是有用的-它确保默认情况下没有选择启用的选项。
Illarion Kovalchuk

-1是因为这里的其他答案(尤其是Nobtia和Oriol的答案)提供了更多的解释细节和更完整的解决方案。
Mark Amery

7

试试这个:

<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。
Mark Amery

5

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

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。经过Firefox和IE8的测试。


OSX上的Chrome始终显示选择的第一个选项,但它似乎是OSX特定的,因为此处提供的所有解决方案都会导致选择第一个可见的选项。
加马德里尔

而不是span在那里使用legend,那将是完美的,或者label
karlcow

这是一种有趣的方法,也是我看到的使这种行为在Safari上运行的唯一可能方法,但在这里实施不佳;您至少需要pointer-events: none跨度才能允许点击通过选择。
Mark Amery

0
<option value="" id="ddl" name="prop" style="display:none;" disabled selected>chose something </option>

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


0

Op1:

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

Op2:

$('#MySelectid option')
.filter(function() { return $.trim( $(this).text() ) == 'text to find'; })​​​​​​​​.attr('selected','selected');​​​​​​​
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.