Текст за замовчуванням, який не відображатиметься у спадному списку


108

У мене є selectспочатку показ мови вибору, поки користувач не вибере мову. Коли користувач відкриває вибір, я не хочу, щоб він відображав варіант вибору мови , оскільки це не фактичний варіант.

Як я можу цього досягти?

Відповіді:


214

Рішення Кайла для мене спрацювало чудово, тому я зробив свої дослідження, щоб уникнути будь-яких 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

Зверніть увагу , що атрибут , який використовується у відповіді вище, є атрибутом , який може бути встановлений на будь-який HTML елемент, і, як правило (але не обов'язково) , реалізований бути еквівалентно установці з допомогою CSS. hiddendisplay: none
Марк Амері

2
Зауважте також, що налаштування hiddenна optionв а selectне працює в Safari, ні на iOS, ні на Mac. Таким чином, ця відповідь пропонує лише часткову підтримку браузера.
Марк Амері

1
Це прекрасно!
Фібо Ковальський

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;
Оріол

2
"display: none" не ігнорується веб-переглядачами, які використовують вибрані пристрої, такі як Android та iOS. Ви повинні вилучити опцію з DOM у select.focus та повернути її та вибрати її у select.blur, щоб вона працювала.
Радек Печ

-1; як відповідь Нобіти, що використовуєhidden (який "типово реалізується в CSS" з display: noneбудь-яким способом), використовуючи display: noneна optionне працює в Safari; опція все ще з’являється.
Марк Амерді

50

Правильний та семантичний спосіб - це використання опції мітки заповнення :

  • Додайте optionелемент як перший дочірникselect
  • Встановіть цеvalue= ""option
  • Встановіть текст заповнення як вміст цього option
  • Додайте requiredатрибут доselect

Це змусить користувача вибрати інший варіант для того , щоб мати можливість представити форму, і браузери повинні надаватиoption за бажанням:

Якщо елемент вибору містить опцію мітки заповнення заповнення, очікується, що агент користувача виведе цю опцію таким чином, що передає, що це мітка, а не допустима опція елемента керування.

Однак більшість браузерів вважають це нормальним явищем option. Тож нам доведеться це виправити вручну, додавши до цього option:

  • selectedАтрибут, щоб зробити його обраний за замовчуванням
  • disabledАтрибут, щоб зробити його не обирали користувачем
  • display: none, щоб приховати це зі списку значень

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як здається, що більшість мобільних браузерів ігнорує display: noneатрибут CSS, і це, на мій погляд, ще більш семантично правильне.
Gaboik1

@ Gaboik1 У коментарях до цієї відповіді я зазначив, що hiddenце, як правило, реалізовано як display: noneпід кришкою (і специфікація прямо пропонує це як "типову" реалізацію). Тому я був би здивований, якби у будь-яких браузерах - мобільних чи інших, - де hiddenпрацювали, але display: noneне було. Чи можете ви навести який-небудь приклад?
Марк Амерді

21

Оскільки ви не можете використовувати присвоєння заповнювачів для selectтегів, я не вірю, що існує якийсь спосіб зробити саме те, що ви просите, за допомогою чистого HTML / CSS. Однак ви можете зробити щось подібне:

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

"Вибрати мову" відобразиться у спадному меню, але після вибору іншого варіанту його повторний вибір не вдасться.

Я сподіваюся, що це допомагає.


2
Я виявив, що найкращим є поєднання відключеного та вибраного з style = "display: none;". Вимкнено корисно, коли ви хочете провести перевірку - він гарантує, що у вас немає вибраної опції, вибраної за замовчуванням.
Ілларіон Ковальчук

-1 тому що інші відповіді (зокрема, Нобтія та Оріол) дають як набагато більше пояснювальних деталей, так і набагато більш повні рішення.
Марк Амерді

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.
Марк Амері

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.


Chrome на OSX завжди показує вибраний перший параметр, але він здається специфічним для OSX, тому що всі запропоновані тут рішення ведуть до вибору першого видимого параметра.
Гамадриль

замість того, spanщоб там використовувати, legendі це було б ідеально абоlabel
karlcow

Це цікавий підхід і єдиний можливий спосіб, який я бачу, щоб змусити цю поведінку працювати над Safari, але він погано реалізований тут; вам, принаймні, потрібно, pointer-events: noneщоб пропустити кліки для вибору.
Марк Амері

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

Ви можете, звичайно, перемістити css у файл css, якщо хочете, і поставити скрипт, щоб схопити escкнопку, щоб знову вибрати інвалід. На відміну від інших подібних відповідей, які я викладаю value="", це так, якщо ви надсилаєте значення (-и) свого списку вибору у формі, воно не буде містити "щось вибране". У asp.net mvc 5, надісланий як компільований json, var obj = { prop:$('#ddl').val(),...};а JSON.stringify(obj);значення опори буде нульовим.


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');​​​​​​​
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.