Как отобразить только текст в HTML5 списка данных, а не значение?

Вот пример:

<input list="browsers" name="browser">
<datalist id="browsers">
    <option value="Internet Explorer">1</option>
    <option value="Firefox">2</option>
    <option value="Chrome">3</option>
    <option value="Opera">4</option>
    <option value="Safari">5</option>
</datalist>

http://jsfiddle.net/j7ehtqjd/1/

Решение, которого я хочу достичь, заключается в том, что, когда я нажимаю на элемент ввода, значение будет отображаться не только в тексте (т.е. 1, 2, 3, 4, 5). Я должен использовать ответ JSON для моей реальной проблемы.

Опять же, должен отображаться только текст, а значение должно быть скрыто, как общий выпадающий список. Эта функция автозаполнения необходима, иначе я бы пошел с обычным выпадающим.

Ответы

Ответ 1

Изменить, обновить

Следующий регент

Попробуйте (v3)

HTML

<input id="selected" list="browsers" name="browser">
<datalist id="browsers">
    <option data-value="InternetExplorer" value="1"></option>
    <option data-value="Firefox" value="2"></option>
    <option data-value="Chrome" value="3"></option>
    <option data-value="Opera" value="4"></option>
    <option data-value="Safari" value="5"></option>
</datalist>
<input id="submit" type="submit">

JS

$(document).ready(function() {

var data = {}; 
$("#browsers option").each(function(i,el) {  
   data[$(el).data("value")] = $(el).val();
});
// `data` : object of `data-value` : `value`
console.log(data, $("#browsers option").val());


    $('#submit').click(function()
    {
        var value = $('#selected').val();
        alert($('#browsers [value="' + value + '"]').data('value'));
    });
});

jsfiddle http://jsfiddle.net/guest271314/j7ehtqjd/13/

Ответ 2

Довольно грязный метод для выполнения этого без зависимостей, такой как jQuery (править: я понимаю, что jQuery используется OP, но этот метод будет хорошо интегрироваться с или без jQuery, поэтому может помочь другим, кто этого не делает).

Сначала поменяйте местами ваши значения и текстовые узлы, вот так:

<input list="browsers" name="browser" id="my_input">
  <datalist id="browsers">
    <option value="Internet Explorer">1</option>
    <option value="Firefox">2</option>
    <option value="Chrome">3</option>
    <option value="Opera">4</option>
    <option value="Safari">5</option>
  </datalist>
  <input type="submit">

Это гарантирует, что ввод всегда показывает правильное значение для пользователя. Затем добавьте JavaScript, чтобы проверить текстовый узел на соответствующее значение, например:

let $input = document.getElementById('my_input');
let $datalist = document.getElementById('browsers');

$input.addEventListener('change', () => {
  let _value = null;

  let input_value = $input.value;
  let options = $datalist.children;
  let i = options.length;

  while(i--) {
    let option = options[i];

    if(option.value == input_value) {
      _value = option.textContent;
      break;
    }
  }

  if(_value == null) {
    console.warn('Value does not exist');
    return false;
  }

  console.log('The value is:', _value );
});

Вы также можете изменить слушатель события 'change' на 'keyup', чтобы получить обратную связь в реальном времени. И вместо console.log('The value is:', _value ) вы можете просто добавить дополнительный hidden ввод для хранения значения, что позволит вам отправлять как значение, так и идентификатор.

Это использует современную нотацию JavaScript, но чтобы сделать ее обратно совместимой, нужно просто изменить 'change',() => { вызов 'change', function() { и change let to var.