2013-02-26 2 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! 왜 대답이 없습니까!? –

+0

글쎄, 나는이게 가능하다고 생각하지 않아. 'maxlength = "4"'또는'pattern = "Ray \ d"' –

+0

과 같은 다른 요구 사항을 추가하여 표시된 항목 세트 만 줄일 수 있습니다. 또한 작성 시점 (2014 년 5 월) template' 태그는 Chrome, Opera Desktop 및 Mozilla FF에서만 지원됩니다. [여기를보십시오] (http://caniuse.com/#search=template). ['datalist'] (http://caniuse.com/#search=datalist)와 같음, IE 10+ 부분 지원 + – Tyblitz

답변

7

당신이 이런 일을 할 수있는 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

'getElementById' 대신에'document.querySelector'를 왜 사용합니까? 후자는 훨씬 더 빠르고 효율적입니다. http://jsperf.com/getelementbyid-vs-queryselector – Tyblitz

+1

기억하기 좋은 API 일뿐입니다. 이 예에서 우리는 한 번만 선택을 모두 수행하므로 아무런 차이가 없습니다. –

관련 문제