需要使用箭头键来浏览搜索建议

Ope*_*eyi 4 html javascript css jquery

我有一个带有很好建议的搜索栏,我需要能够使用箭头键来浏览选项,但它不起作用,我真的很困惑,请你帮帮我,我一直在与这个作斗争好几天了。

var searchIndex = ["404 Error", "Address Bar", "Ajax", "Apache", "Autoresponder", "BitTorrent", "Blog", "Bookmark", "Bot", "Broadband", "Captcha", "Certificate", "Client", "Cloud", "Cloud Computing", "CMS", "Cookie", "CSS", "Cyberspace", "Denial of Service", "DHCP", "Dial-up", "DNS Record", "Domain Name", "Download", "E-mail", "Facebook", "FiOS", "Firewall", "FTP", "Gateway", "Google", "Google Drive", "Gopher", "Hashtag", "Hit", "Home Page", "HTML", "HTTP", "HTTPS", "Hyperlink", "Hypertext", "ICANN", "Inbox", "Internet", "InterNIC", "IP", "IP Address", "IPv4", "IPv6", "IRC", "iSCSI", "ISDN", "ISP", "JavaScript", "jQuery", "Meta Search Engine", "Meta Tag", "Minisite", "Mirror", "Name Server", "Packet", "Page View", "Payload", "Phishing", "POP3", "Protocol", "Scraping", "Search Engine", "Social Networking", "Socket", "Spam", "Spider", "Spoofing", "SSH", "SSL", "Static Website", "Twitter", "XHTML"];

var input = document.getElementById("searchBox"),
  ul = document.getElementById("searchResults"),
  inputTerms, termsArray, prefix, terms, results, sortedResults;


var search = function() {
  inputTerms = input.value.toLowerCase();
  results = [];
  termsArray = inputTerms.split(' ');
  prefix = termsArray.length === 1 ? '' : termsArray.slice(0, -1).join(' ') + ' ';
  terms = termsArray[termsArray.length - 1].toLowerCase();

  for (var i = 0; i < searchIndex.length; i++) {
    var a = searchIndex[i].toLowerCase(),
      t = a.indexOf(terms);

    if (t > -1) {
      results.push(a);
    }
  }

  evaluateResults();
};

var evaluateResults = function() {
  if (results.length > 0 && inputTerms.length > 0 && terms.length !== 0) {
    sortedResults = results.sort(sortResults);
    appendResults();
  } else if (inputTerms.length > 0 && terms.length !== 0) {
    ul.innerHTML = '<li>Whoah! <strong>' +
      inputTerms +
      '</strong> is not in the index. <br><small><a href="http://google.com/search?q=' +
      encodeURIComponent(inputTerms) + '">Try Google?</a></small></li>';

  } else if (inputTerms.length !== 0 && terms.length === 0) {
    return;
  } else {
    clearResults();
  }
};

var sortResults = function(a, b) {
  if (a.indexOf(terms) < b.indexOf(terms)) return -1;
  if (a.indexOf(terms) > b.indexOf(terms)) return 1;
  return 0;
}

var appendResults = function() {
  clearResults();

  for (var i = 0; i < sortedResults.length && i < 5; i++) {
    var li = document.createElement("li"),
      result = prefix +
      sortedResults[i].toLowerCase().replace(terms, '<strong>'+ terms + '</strong>');

    li.innerHTML = result;

    ul.appendChild(li);
  }
  $('li').click(function(e) {
    $('input').val($(this).text());
  });
  if (ul.className !== "term-list") {
    ul.className = "term-list";
  }
};

var clearResults = function() {
  ul.className = "term-list hidden";
  ul.innerHTML = '';
};

input.addEventListener("keyup", search, false);





var li = $('li');
var liSelected;
$(window).keydown(function(e) {
  if (e.which === 40) {
    if (liSelected) {
      liSelected.removeClass('selected');
      next = liSelected.next();
      if (next.length > 0) {
        liSelected = next.addClass('selected');
      } else {
        liSelected = li.eq(0).addClass('selected');
      }
    } else {
      liSelected = li.eq(0).addClass('selected');
    }
  } else if (e.which === 38) {
    if (liSelected) {
      liSelected.removeClass('selected');
      next = liSelected.prev();
      if (next.length > 0) {
        liSelected = next.addClass('selected');
      } else {
        liSelected = li.last().addClass('selected');
      }
    } else {
      liSelected = li.last().addClass('selected');
    }
  }
});
Run Code Online (Sandbox Code Playgroud)
.search-field,
.term-list {
  -moz-border-radius: 3px;
  -webkit-border-radius: 3px;
  border-radius: 3px;
}

body {
  text-align: center;
  background: #f2f2f2;
}

.title {
  width: 100%;
  margin: 3em 0 1em;
  text-align: center;
  font-family: "Arvo", "Helvetica Neue", Helvetica, arial, sans-serif;
  font-size: 170%;
  font-weight: 400;
  color: #2a5ba3;
  text-shadow: #fff 1px 1px 0px, #ddd 2px 2px, #ddd 3px 3px 1px;
}

.search-field {
  display: block;
  width: 30%;
  margin: 1em auto 0;
  padding: 0.5em 10px;
  border: 1px solid #999;
  font-size: 130%;
  font-family: "Arvo", "Helvetica Neue", Helvetica, arial, sans-serif;
  font-weight: 400;
  color: #3e8ce0;
}

.term-list {
  list-style: none inside;
  width: 30%;
  margin: 0 auto 2em;
  padding: 5px 10px 0;
  text-align: left;
  color: #777;
  background: #fff;
  border: 1px solid #ddd;
  font-family: "Arvo", "Helvetica Neue", Helvetica, arial, sans-serif;
  font-weight: 400;
}

.term-list li {
  padding: 0.5em 0;
  border-bottom: 1px solid #eee;
}

li.selected {
  background: yellow
}

.term-list strong {
  color: #444;
  font-weight: 700;
}

.hidden {
  display: none;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<h1 class="title">AutoComplete Me</h1>
<input type="text" id="searchBox" class="search-field" autoFocus />
<ul id="searchResults" class="term-list hidden"></ul>
Run Code Online (Sandbox Code Playgroud)

Nad*_*kar 5

您唯一要参考的地方li是这里

var li = $('li');
var liSelected;
$(window).keydown(function(e) { ...
Run Code Online (Sandbox Code Playgroud)

但当时在dom中没有添加li,因此$('li')返回零元素。

更远,

当您从 dom 中删除 li 并在搜索后在每个按键上添加新的 li 时,您会在每次搜索/按键时丢失对 li 标签的引用。

这里,

var clearResults = function() {
 debugger;
  ul.className = "term-list hidden";
  ul.innerHTML = ''; // Removing all li inside the ul
}
Run Code Online (Sandbox Code Playgroud)

因此,您的旧li变量引用了现在已删除的旧 li's。

解决方案:

li在 appendResults 函数中添加新 li 后,您需要更新变量。

var appendResults = function() {
  clearResults();
  for (var i = 0; i < sortedResults.length && i < 5; i++) {
    var _li = document.createElement("li"),
      result = prefix +
      sortedResults[i].toLowerCase().replace(terms, '<strong>'+ terms + '</strong>');

    _li.innerHTML = result;

    ul.appendChild(_li);
  }

  li = $('li');
  liSelected = li.filter('.selected');
  $('li').click(function(e) {
    $('input').val($(this).text());
  });
  if (ul.className !== "term-list") {
    ul.className = "term-list";
  }
};
Run Code Online (Sandbox Code Playgroud)

此外,您的搜索功能也被调用每个键,也用于向下和向上键,您必须检查向上和向下键并返回。

var search = function(e) {
  if(e.which==40||e.which==38) return;
  debugger;
  inputTerms = input.value.toLowerCase();
  results = [];
  termsArray = inputTerms.split(' ');
  prefix = termsArray.length === 1 ? '' : termsArray.slice(0, -1).join(' ') + ' ';
  terms = termsArray[termsArray.length - 1].toLowerCase();

  for (var i = 0; i < searchIndex.length; i++) {
    var a = searchIndex[i].toLowerCase(),
      t = a.indexOf(terms);

    if (t > -1) {
      results.push(a);
    }
  }

  evaluateResults();
};
Run Code Online (Sandbox Code Playgroud)

片段

var li = $('li');
var liSelected;
$(window).keydown(function(e) { ...
Run Code Online (Sandbox Code Playgroud)
var clearResults = function() {
 debugger;
  ul.className = "term-list hidden";
  ul.innerHTML = ''; // Removing all li inside the ul
}
Run Code Online (Sandbox Code Playgroud)
var appendResults = function() {
  clearResults();
  for (var i = 0; i < sortedResults.length && i < 5; i++) {
    var _li = document.createElement("li"),
      result = prefix +
      sortedResults[i].toLowerCase().replace(terms, '<strong>'+ terms + '</strong>');

    _li.innerHTML = result;

    ul.appendChild(_li);
  }

  li = $('li');
  liSelected = li.filter('.selected');
  $('li').click(function(e) {
    $('input').val($(this).text());
  });
  if (ul.className !== "term-list") {
    ul.className = "term-list";
  }
};
Run Code Online (Sandbox Code Playgroud)