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


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.