2013-02-26 2 views
13

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

Например: 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> 
+1

Давай! Интересный вопрос, +1! Почему нет ответов !? –

+0

Ну, я не думаю, что это возможно. Вы можете только уменьшить количество отображаемых элементов, добавив другие требования, такие как 'maxlength =" 4 "' или 'pattern =" Ray [0123] \ d "' –

+0

Также обратите внимание, что на момент написания (май 2014 года) тег шаблона поддерживается только в Chrome, Opera Desktop и Mozilla FF. [См. Здесь] (http://caniuse.com/#search=template). То же самое для ['datalist'] (http://caniuse.com/#search=datalist), + частичная поддержка IE 10+ – Tyblitz

ответ

7

С некоторых современных 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> 

И вот ЯШ:

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/

+0

Просто интересно, зачем использовать' document.querySelector' в этом случае вместо 'getElementById', когда последний намного быстрее и эффективнее? http://jsperf.com/getelementbyid-vs-queryselector – Tyblitz

+1

Это просто приятный апи, чтобы помнить. И в этом примере мы выполняем только один раз, так что это не имеет никакого значения. –