Limit total entries displayed by datalist

后端 未结 2 1412
予麋鹿
予麋鹿 2020-12-05 14:46

When there is a long set of elements in a datalist, they will all get displayed with a scroll bar next to them. Is there an easy way to only display the top 5, and just cut

相关标签:
2条回答
  • 2020-12-05 15:15

    With some modern javascript and html you could do something like this.

    Here's the document:

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

    And here's the 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);
    });
    

    And here's a live example: http://jsfiddle.net/gildean/yxafa/6/

    0 讨论(0)
  • 2020-12-05 15:26

    No javascript example:

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

    Took me a minute of experimenting :) PS: The minimum length should protect against empty submissions. However, you'll need to select the object and then hit backspace to see :|

    0 讨论(0)
提交回复
热议问题