2013-02-26 26 views
13

Khi có một tập hợp dài các phần tử trong một nhà dữ liệu, tất cả chúng sẽ được hiển thị cùng với thanh cuộn bên cạnh chúng. Có cách nào dễ dàng để chỉ hiển thị 5 trang web hàng đầu và chỉ cắt giảm các quảng cáo khác không?Giới hạn tổng số mục được hiển thị bởi nhà dữ liệu

Ví dụ: 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

Thôi nào! Câu hỏi thú vị, +1! Tại sao không có câu trả lời !? –

+0

Vâng, tôi không nghĩ rằng tôi có thể atm. Bạn chỉ có thể giảm tập hợp các mục được hiển thị bằng cách thêm các yêu cầu khác như 'maxlength =" 4 "' hoặc 'pattern =" Ray [0123] \ d "' –

+0

Cũng lưu ý rằng, tại thời điểm viết (tháng 5 năm 2014) thì ' Thẻ template' chỉ được hỗ trợ trong Chrome, Opera Desktop và Mozilla FF. [Xem tại đây] (http://caniuse.com/#search=template). Tương tự cho ['datalist'] (http://caniuse.com/#search=datalist), + hỗ trợ một phần cho IE 10+ – Tyblitz

Trả lời

7

Với một số javascript hiện đại và HTML bạn có thể làm một cái gì đó như thế này.

Dưới đây là tài liệu:

<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> 

Và đây là 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); 
}); 

Và đây là một ví dụ sống: http://jsfiddle.net/gildean/yxafa/6/

+0

Chỉ cần tự hỏi ', tại sao lại sử dụng' document.querySelector' trong trường hợp này thay vì 'getElementById' khi sau này nhanh hơn và hiệu quả hơn nhiều? http://jsperf.com/getelementbyid-vs-queryselector – Tyblitz

+1

Nó chỉ là một api đẹp hơn để ghi nhớ. Và trong ví dụ này, chúng tôi chỉ làm tất cả các lựa chọn một lần, vì vậy nó không tạo ra sự khác biệt. –

Các vấn đề liên quan