Ограничить общее количество записей, отображаемых даталистом

Когда в списке данных имеется длинный набор элементов, все они отображаются с полосой прокрутки рядом с ними. Есть ли простой способ отобразить только топ-5 и просто отрезать остальные?

Например: http://jsfiddle.net/yxafa/

<input type="text" name="search" id="search" placeholder="type 'r'" list="searchresults" autocomplete="off">
<datalist id="searchresults">
    <option>Ray0</option>
    <option>Ray1</option>
    <option>Ray2</option>
    <option>Ray3</option>
    <option>Ray01</option>
    <option>Ray11</option>
    <option>Ray21</option>
    <option>Ray31</option>
    <option>Ray02</option>
    <option>Ray12</option>
    <option>Ray22</option>
    <option>Ray32</option>
    <option>Ray012</option>
    <option>Ray112</option>
    <option>Ray212</option>
    <option>Ray312</option>
    <option>Ray03</option>
    <option>Ray13</option>
    <option>Ray23</option>
    <option>Ray33</option>
    <option>Ray013</option>
    <option>Ray113</option>
    <option>Ray213</option>
    <option>Ray313</option>
    <option>Ray023</option>
    <option>Ray123</option>
    <option>Ray223</option>
    <option>Ray323</option>
    <option>Ray0123</option>
    <option>Ray1123</option>
    <option>Ray2123</option>
    <option>Ray3123</option>
</datalist>

4 ответа

Решение

С некоторыми современными JavaScript и HTML вы можете сделать что-то вроде этого.

Вот документ:

<template id="resultstemplate">
    <option>Ray0</option>
    <option>Ray1</option>
    <option>Ray2</option>
    <option>Ray3</option>
    <option>Ray01</option>
    <option>Ray11</option>
    <option>Ray21</option>
    <option>Ray31</option>
    <option>Ray02</option>
    <option>Ray12</option>
    <option>Ray22</option>
    <option>Ray32</option>
    <option>Ray012</option>
    <option>Ray112</option>
    <option>Ray212</option>
    <option>Ray312</option>
    <option>Ray03</option>
    <option>Ray13</option>
    <option>Ray23</option>
    <option>Ray33</option>
    <option>Ray013</option>
    <option>Ray113</option>
    <option>Ray213</option>
    <option>Ray313</option>
    <option>Ray023</option>
    <option>Ray123</option>
    <option>Ray223</option>
    <option>Ray323</option>
    <option>Ray0123</option>
    <option>Ray1123</option>
    <option>Ray2123</option>
    <option>Ray3123</option>
</template>
<input type="text" name="search" id="search"  placeholder="type 'r'" list="searchresults" autocomplete="off" />
<datalist id="searchresults"></datalist>

А вот и JS:

var search = document.querySelector('#search');
var results = document.querySelector('#searchresults');
var templateContent = document.querySelector('#resultstemplate').content;
search.addEventListener('keyup', function handler(event) {
    while (results.children.length) results.removeChild(results.firstChild);
    var inputVal = new RegExp(search.value.trim(), 'i');
    var clonedOptions = templateContent.cloneNode(true);
    var set = Array.prototype.reduce.call(clonedOptions.children, function searchFilter(frag, el) {
        if (inputVal.test(el.textContent) && frag.children.length < 5) frag.appendChild(el);
        return frag;
    }, document.createDocumentFragment());
    results.appendChild(set);
});

И вот живой пример: http://jsfiddle.net/gildean/yxafa/6/

Это не ответ на исходный вопрос (где разработчик хочет ограничить элементы, отображаемые в списке данных).

Однако я пришел к этому вопросу, потому что меня беспокоило другое ограничение (когда разработчики не хотят ограничивать элементы, отображаемые в списке данных, но у браузера есть ограничение (Chrome имеет ограничение 512; показывает только до 512 вариантов). вовремя)

Этот JSFiddle демонстрирует проблему; см. скриншот ниже.

Конечно, когда пользователь начинает вводить данные (которые фильтруют параметры, показанные в списке данных), может быть меньше 512 результатов, поэтому это ограничение браузера не будет заметным . Но если ваш пользователь ожидает увидеть каждый вариант в вашем списке данных, а количество отфильтрованных результатов превышает 512, будьте осторожны с ограничением Chrome.

      searchresults = document.getElementById('searchresults');

// Even though you add 1000 options to the datalist 
// chrome will only show up to 512 of those options at one time
for (let i = 0; i < 1000; i++) {
  let option = document.createElement('option');
  option.innerText = 'Val ' + (i+1);
  searchresults.appendChild(option);
}

Если вам нужно показать > 512 вариантов...

Рассмотрим<select>вместо этого (во многих реализациях браузера пользователь может сосредоточиться на выборе, начать печатать и при этом «фильтровать» выбранный параметр. Но это ограничено поиском начала слова и может не обрабатывать специальные символы.)

Рассмотрим библиотеку пользовательского интерфейса с элементом управления «автозаполнение»/«поле со списком» ( пример в «Поле со списком» KendoUI ) или создание собственной (пример в AngularJS)

Нет примера javascript:

  <input list="site" name="f" minlength="2" style="height:5.1em">
  <datalist id="site" style="height:5.1em;overflow:hidden">

У меня ушла минута экспериментов:) PS: Минимальная длина должна защищать от пустых материалов. Однако вам нужно выбрать объект, а затем нажать клавишу Backspace, чтобы увидеть:|

Другие вопросы по тегам