2013-02-26 43 views
13

當數據列表中存在一組較長的元素時,它們將全部顯示,旁邊有一個滾動條。有沒有簡單的方法只顯示前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> 
+1

加油!有趣的問題,+1!爲什麼沒有答案!? – 2014-05-28 08:35:32

+0

嗯,我不認爲這可能是atm。您只能通過添加其他要求(如「maxlength =」4「'或」pattern =「Ray \ d」' – 2014-05-30 09:57:46

+0

「)來減少顯示項目的集合。另請注意,在撰寫本文時(2014年5月)模板標籤僅在Chrome,Opera Desktop和Mozilla FF中受支持。 [見這裏](http://caniuse.com/#search=template)。 ['datalist'](http://caniuse.com/#search=datalist),+ IE 10+的部分支持相同 – Tyblitz 2014-05-30 12:20:20

回答

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> 

而這裏的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/

+0

只是wonderin',爲什麼在這種情況下使用'document.querySelector'而不是'getElementById'後者更快更高效? http://jsperf.com/getelementbyid-vs-queryselector – Tyblitz 2014-05-30 12:14:10

+1

這只是一個更好的api記住。在這個例子中,我們只做了一次所有的選擇,所以它沒有區別。 – 2014-05-30 12:28:29