Форма вибору HTML з можливістю введення спеціального значення


104

Я хотів би мати поле введення, яке користувачі можуть вводити власне текстове значення або вибирати зі спадного меню. Звичайний <select>пропонує лише випадаючі варіанти.

Як я можу <select>прийняти спеціальне значення? Наприклад: Ford?

<select>
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="mercedes">Mercedes</option>
  <option value="audi">Audi</option>
</select>

Ви можете використовувати javascript для динамічного додавання параметра до вибраного, але тоді використання цієї інформації стане справжньою проблемою.
Девід

Я не додав цю опцію для користувацьких значень на своєму веб-сайті finnmglas.com/contact, проте хтось зв’язався зі мною із користувацьким значенням. Це так дивно
finnmglas

Відповіді:


249

HTML5 має вбудовану комбіновану рамку. Ви створюєте текст inputі a datalist. Потім додати listатрибут до input, із значенням з idз datalist.

Оновлення: станом на березень 2019 року всі основні браузери (тепер, включаючи Safari 12.1 та iOS Safari 12.3) підтримують datalistрівень, необхідний для цієї функціональності. Див caniuse для детальної підтримки браузера.

Це виглядає так:

<input type="text" list="cars" />
<datalist id="cars">
  <option>Volvo</option>
  <option>Saab</option>
  <option>Mercedes</option>
  <option>Audi</option>
</datalist>


3
Цю функцію підтримує лише близько 50% браузерів. Тільки останні версії Firefox, Chrome і Opera підтримують це; IE, Safari та мобільні браузери - ні. Див. Http://caniuse.com/
markmarijnissen

2
Це вже половина 2016 року (більш ніж через 2 роки), і більшість браузерів все ще не повністю підтримують це, принаймні без значних помилок. Принаймні щось працюватиме в останніх версіях майже всього, крім Safari / Safari iOS, але вам потрібно протестувати, щоб переконатися, що ваші випадки використання працюють належним чином. Це все-таки найкраща відповідь.
Майкл Гаскілл

1
У мене це добре працює. У багатьох випадках нам не потрібно підтримувати старі браузери. Я додав лише зображення зі стрілкою вниз на тлі поля введення, щоб дати користувачам натяк на його розширення. Код (потрібен фактичний файл зображення):<input type="text" list="cars" style="background:url('images/arrow_down.png') no-repeat right center">
Євген Кардаш

4
Я щойно тестував в останніх версіях IE, Firefox та Chrome, і все працює нормально. Я думаю, що це чудове просте рішення цієї поширеної проблеми для багатьох випадків.
kerl

3
Я дуже хотів використовувати це, але мені потрібно було встановити значення за замовчуванням. Користувач бачить лише значення за замовчуванням у випадаючому списку порівняно з усіма параметрами (оскільки вони відфільтровані). Вони повинні знати, щоб очистити поле введення, перш ніж побачити всі параметри.
Джастін

26

Останній JSFiddle Alen Saqe не перемикався для мене у Firefox, тому я подумав, що запропоную простий обхідний спосіб html / javascript, який буде добре функціонувати у формах (щодо подання) до дня, коли тег даталіста буде прийнятий усіма браузерами / пристроями. Щоб отримати докладнішу інформацію та побачити це в дії, перейдіть за посиланням: http://jsfiddle.net/6nq7w/4/ Примітка. Не допускайте пробілів між перемиканням братів і сестер!

<!DOCTYPE html>
<html>
<script>
function toggleField(hideObj,showObj){
  hideObj.disabled=true;        
  hideObj.style.display='none';
  showObj.disabled=false;   
  showObj.style.display='inline';
  showObj.focus();
}
</script>
<body>
<form name="BrowserSurvey" action="#">
Browser: <select name="browser" 
          onchange="if(this.options[this.selectedIndex].value=='customOption'){
              toggleField(this,this.nextSibling);
              this.selectedIndex='0';
          }">
            <option></option>
            <option value="customOption">[type a custom value]</option>
            <option>Chrome</option>
            <option>Firefox</option>
            <option>Internet Explorer</option>
            <option>Opera</option>
            <option>Safari</option>
        </select><input name="browser" style="display:none;" disabled="disabled" 
            onblur="if(this.value==''){toggleField(this,this.previousSibling);}">
<input type="submit" value="Submit">
</form>
</body>
</html>


Я хотів би знову пройти цю скрипку! Відьма-версія Firefox там не підтримувалася! Я протестував його з якоюсь версією, якої не пам’ятаю! Слава!
Alen Saqe

Я не знаю, на якій версії FF я був. Я щойно подивився FF34.0 і зараз отримую функціонал, тому не хвилюйтеся. Однак типовий параметр перемикання "Інше" можна скасувати. Коли я видаляю "Інше", редагуючи значення, у меню, що випадає, не пропонується інтуїтивно зрозуміле значення (для доступу до функції редагування). Я думаю, що це зводиться до особистих переваг. Оскільки стрілка dropmenu все ще присутня, коли поле можна редагувати, користувачі можуть не усвідомлювати, що поле можна редагувати. Не маючи копання у вас; лише деякі відгуки. Мій фрагмент також враховує іменування полів всередині <form>.
mickmackusa

Кінцевим результатом цього геніального, але нерозбірливого (для мене) сценарію + html є приєднання вибраного значення параметра або введеного тексту до GET тієї ж сторінки, що і рядок запиту. Хтось знає, як перетворити дію на POST, щоб я міг захопити значення у php-файлі і щось там зробити?
Ган

Я створив цей сценарій з конкретним наміром, щоб він поводився відповідно до поданих форм html. Чи використовуєте ви метод post як атрибут у тезі форми? @Han, якщо ви створюєте посилання 3v4l.org на ваш ізольований фрагмент, я можу швидко поглянути і, можливо, порадити.
mickmackusa

1
Хлопчик, я почуваюся німо. Я забув помістити метод у тег форми. Він працював так, як було розміщено з цією незначною модифікацією: <form name = "BrowserSurvey" method = "post" action = "/ gotThis.php"> ... Гарний сценарій, mickmackusa. Дякуємо за ваш підказку!
Ган

16

Рішення jQuery!

Демо: http://jsfiddle.net/69wP6/2/

Ще одна демонстрація нижче (оновлена!)

Мені потрібно було щось подібне у випадку, коли у мене були деякі фіксовані параметри, і я хотів, щоб ще один варіант редагувався! У цьому випадку я зробив прихований ввід, який перекривав би вибраний параметр, редагувався та використовував jQuery, щоб це все працювало безперебійно.

Я ділюсь скрипкою з усіма вами!

HTML

<div id="billdesc">
    <select id="test">
      <option class="non" value="option1">Option1</option>
      <option class="non" value="option2">Option2</option>
      <option class="editable" value="other">Other</option>
    </select>
    <input class="editOption" style="display:none;"></input>
</div>

CSS

body{
    background: blue;
}
#billdesc{
    padding-top: 50px;
}
#test{
    width: 100%;
    height: 30px;
}
option {
    height: 30px;
    line-height: 30px;
}

.editOption{
    width: 90%;
    height: 24px;
    position: relative;
    top: -30px

}

jQuery

var initialText = $('.editable').val();
$('.editOption').val(initialText);

$('#test').change(function(){
var selected = $('option:selected', this).attr('class');
var optionText = $('.editable').text();

if(selected == "editable"){
  $('.editOption').show();


  $('.editOption').keyup(function(){
      var editText = $('.editOption').val();
      $('.editable').val(editText);
      $('.editable').html(editText);
  });

}else{
  $('.editOption').hide();
}
});

Редагувати: Додано кілька простих штрихів з розумним дизайном, щоб люди могли чітко бачити, де введення закінчується!

Скрипка JS: http://jsfiddle.net/69wP6/4/


11

Ви не можете насправді. Вам доведеться мати як спадне меню, так і текстове поле, і вони повинні вибрати або заповнити форму. Без javascript ви можете створити окремий набір перемикачів, де вони вибирають спадне меню або введення тексту, але це здається мені безладним. За допомогою деяких javascript ви можете вимкнути те чи інше, залежно від того, який з них вибрати, наприклад, у спадному меню, що запускає текстове поле, є параметр "інший".


9

Якщо опція datalist не відповідає вашим вимогам, перегляньте бібліотеку Select2 та " Динамічне створення опції "

$(".js-example-tags").select2({
  tags: true
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/css/select2.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.6-rc.0/js/select2.min.js"></script>


<select class="form-control js-example-tags">
  <option selected="selected">orange</option>
  <option>white</option>
  <option>purple</option>
</select>


0

Використовуючи одне з наведених вище рішень (@mickmackusa), я створив робочий прототип у React 16.8+ за допомогою Hooks.

https://codesandbox.io/s/heuristic-dewdney-0h2y2

Сподіваюся, це комусь допоможе.


Я маю честь. Я щойно перевірив свої записи, і це був 12-й пост, який я зробив тут, на Stack Overflow - відчуває себе як мільйон років тому.
mickmackusa

Я щойно погрався з вашим демо-посиланням, і схоже, ви втратили ефект на невизначений час перемикатися між двома типами полів.
mickmackusa
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.