Javascript search and display divs with matching keywords

后端 未结 2 888
南旧
南旧 2021-02-09 18:49

What I\'m looking for:

I\'m working on creating an easy way for a user to search a list of people, and for results to instantly display below the search field. The resul

相关标签:
2条回答
  • 2021-02-09 19:24

    Split the words in the search string with a regex like

    searchString.split(/\W/);
    

    and do a OR search over each of the words in the resulting array.

    Updated fiddle

    var searchStrings = str_needle.split(/\W/);
    
    for (var i = 0, len = searchStrings.length; i < len; i++) {
        var currentSearch = searchStrings[i].toUpperCase();
        if (currentSearch !== "") {
            nameDivs = document.getElementsByClassName("name");
            for (var j = 0, divsLen = nameDivs.length; j < divsLen; j++) {
                if (nameDivs[j].textContent.toUpperCase().indexOf(currentSearch) !== -1) {
                    nameDivs[j].style.display = "block";
                }
            }
        }
    }
    
    0 讨论(0)
  • 2021-02-09 19:28

    One further approach, is as follows:

    function gid(a_id) {
      return document.getElementById(a_id);
    }
    
    function close_all() {
    
      // applies the Array.prototype.forEach() method to the array-like nodeList
      // returned by document.querySelectorAll() (the string passed to which finds all
      // elements with an id that starts with ('^=') the string 'user_':
      [].forEach.call(document.querySelectorAll('[id^=user_]'), function(div) {
        // 'div' is the array element (the node) itself:
        div.style.display = 'none';
      });
    
    }
    
    
    function find_my_div() {
      close_all();
    
      // getting the trimmed lower-cased string from the input element, split
      // on white-space characters to create an array:
      var keywords = gid('edit_search').value.trim().toLowerCase().split(/\s+/),
        // as above, selecting all elements whose id starts with the string 'user_':
        haystack = document.querySelectorAll('[id^="user_"]'),
        // working out whether text is accessed by node.textContent, or node.innerText:
        textProp = 'textContent' in document.body ? 'textContent' : 'innerText',
        // an initialised variable, for later:
        userWords,
    
        // filters the haystack (the divs whose id starts with 'user_'):
        found = [].filter.call(haystack, function(user) {
          // assigns the lower-cased string to the created-variable:
          userWords = user[textProp].toLowerCase();
          // returns those div elements whose text contains some of
          // the words returned, earlier, as the keywords:
          return keywords.some(function (word) {
            return userWords.indexOf(word) > -1;
          });
        });
    
      // iterates over the found elements, and shows them:
      [].forEach.call(found, function(user) {
        user.style.display = 'block';
      });
    
    }
    

    <body>
      <input type="text" id="edit_search" onkeyup="javascript: find_my_div();">
      <input type="button" onClick="javascript: find_my_div();" value="Find">
    
      <script>
        function gid(a_id) {
          return document.getElementById(a_id);
        }
    
        function close_all() {
    
          [].forEach.call(document.querySelectorAll('[id^=user_]'), function(div) {
            div.style.display = 'none';
          });
    
        }
    
    
        function find_my_div() {
          close_all();
          var keywords = gid('edit_search').value.trim().toLowerCase().split(/\s+/),
            haystack = document.querySelectorAll('[id^="user_"]'),
            textProp = 'textContent' in document.body ? 'textContent' : 'innerText',
            userWords,
            found = [].filter.call(haystack, function(user) {
              userWords = user[textProp].toLowerCase();
              return keywords.some(function (word) {
                return userWords.indexOf(word) > -1;
              });
            });
          console.log(found);
          [].forEach.call(found, function(user) {
            user.style.display = 'block';
          });
    
        }
      </script>
    
      <div id="user_0" style="display:none">Andy Daulton
        <br/>Owner Nissan
        <br/>
        <br/>
      </div>
      <div id="user_1" style="display:none">Doug Guy
        <br/>Bug Collector
        <br/>
        <br/>
      </div>
      <div id="user_2" style="display:none">Sam Hilton
        <br/>Famous Celebrity in Hollywood
        <br/>
        <br/>
      </div>
      <div id="user_3" style="display:none">Don Grey
        <br/>Old man
        <br/>
        <br/>
      </div>
      <div id="user_4" style="display:none">Amy Hinterly
        <br/>Cook
        <br/>
        <br/>
      </div>
      <div id="user_5" style="display:none">Gary Doll
        <br/>Racecar Driver
        <br/>
        <br/>
      </div>
      <div id="user_6" style="display:none">Tod Akers
        <br/>Football Player
        <br/>
        <br/>
      </div>
      <div id="user_7" style="display:none">Greg Barkley
        <br/>Interior designer
        <br/>
        <br/>
      </div>
      <div id="user_8" style="display:none">Alen Simmons
        <br/>8th place winner
        <br/>
        <br/>
      </div>

    References:

    • CSS:
      • Attribute-presence and value selectors.
    • JavaScript:
      • Array.prototype.every().
      • Array.prototype.filter().
      • Array.prototype.forEach().
      • Array.prototype.some().
      • document.querySelectorAll().
      • Function.prototype.call().
      • String.prototype.indexOf()
    0 讨论(0)
提交回复
热议问题