如何创建自动完成

学习如何创建自动完成功能。

自动完成

请开始输入:

亲自试一试

创建自动完成表单

第一步 - 添加 HTML:

<!-- 确保表单已关闭自动完成功能: -->
<form autocomplete="off" action="/action_page.php">
  <div class="autocomplete" style="width:300px;">
    <input id="myInput" type="text" name="myCountry" placeholder="Country">
  </div>
  <input type="submit">
</form>

第二步 - 创建 JavaScript 数组:

包含世界上所有国家/地区的数组:

var countries = ["Afghanistan","Albania","Algeria","Andorra","Angola","Anguilla","Antigua & Barbuda","Argentina","Armenia","Aruba","Australia","Austria","Azerbaijan","Bahamas","Bahrain","Bangladesh","Barbados","Belarus","Belgium","Belize","Benin","Bermuda","Bhutan","Bolivia","Bosnia & Herzegovina","Botswana","Brazil","British Virgin Islands","Brunei","Bulgaria","Burkina Faso","Burundi","Cambodia","Cameroon","Canada","Cape Verde","Cayman Islands","Central Arfrican Republic","Chad","Chile","China","Colombia","Congo","Cook Islands","Kostarika, Ivory Coast, Krowasya, Kuba, Curacao, Siprus, Czechia, Danimarka, Djibouti, Dominika, Dominikan Repублиka, Ekuador, Misr, El Salvador, Ekvatorialna Gvineja, Eritreja, Estonia, Etiopia, Falkland Islands, Faroe Islands, Fiji, Finland, Pransiya, Pransesiya Polinesiya, Pranses West Indies, Gabon, Gambia, Jorjya, Germaniya, Ghana, Gibraltar, Ellas, Grenland, Grenada, Guam, Guatemala, Guernsey, Guinea, Guinea-Bissau, Guyana, Ayiti, Honduras, Hong Kong, Ungariya, Island, India,Indonesia, Iran, Iraq, Ireland, Isle of Man, Israel, Italy, Jamaica, Japan, Jersey, Jordan, Kazakhstan, Kenya, Kiribati, Kosovo, Kuwait, Kyrgyzstan, Laos, Latvia, Lebanon, Lesotho, Liberia, Libya, Liechtenstein, Lithuania, Luxembourg, Macau, Macedonia, Madagascar, Malawi, Malaysia, Maldives, Mali, Malta, Marshall Islands, Mauritania, Mauritius, Mexico, Micronesia, Moldova, Monaco, Mongolia, Montenegro,Montserrat, Morocco, Mozambique, Myanmar, Namibia, Nauro"Nepal","Netherlands","Netherlands Antilles","New Caledonia","New Zealand","Nicaragua","Niger","Nigeria","North Korea","Norway","Oman","Pakistan","Palau","Palestine","Panama","Papua New Guinea","Paraguay","Peru","Philippines","Poland","Portugal","Puerto Rico","Qatar","Reunion","Romania","Russia","Rwanda","Saint Pierre & Miquelon","Samoa","San Marino","Sao Tome and Principe","Saudi Arabia","Senegal","Serbia","Seychelles","Sierra Leone","Singapore","Slovakia","Slovenia","Solomon Islands","Somalia","South Africa","South Korea","South Sudan","Spain, Sri Lanka, St Kitts & Nevis, St Lucia, St Vincent, Sudan, Suriname, Swaziland, Sweden, Switzerland, Syria, Taiwan, Tajikistan, Tanzania, Thailand, Timor L'Este, Togo, Tonga, Trinidad & Tobago, Tunisia, Turkey, Turkmenistan, Turks & Caicos, Tuvalu, Uganda, Ukraine, United Arab Emirates, United Kingdom, United States of America, Uruguay, Uzbekistan, Vanuatu, Vatican City, Venezuela, Vietnam, Virgin Islands (US), Yemen, Zambia, Zimbabwe;

第三步 - 添加 CSS:

容器必须具有“相对”定位。

* { box-sizing: border-box; }
body {
  font: 16px Arial;
}
.autocomplete {
  /* 容器必须相对定位: */
  position: relative;
  display: inline-block;
}
input {
  border: 1px solid transparent;
  background-color: #f1f1f1;
  padding: 10px;
  font-size: 16px;
}
input[type=text] {
  background-color: #f1f1f1;
  width: 100%;
}
input[type=submit] {
  background-color: DodgerBlue;
  color: #fff;
}
.autocomplete-items {
  position: absolute;
  border: 1px solid #d4d4d4;
  border-bottom: none;
  border-top: none;
  z-index: 99;
  /* 将自动完成项定位为与容器相同的宽度: */
  top: 100%;
  left: 0;
  right: 0;
}
.autocomplete-items div {
  padding: 10px;
  cursor: pointer;
  background-color: #fff;
  border-bottom: 1px solid #d4d4d4;
}
.autocomplete-items div:hover {
  /* Kapag may mouse hover sa item: */
  background-color: #e9e9e9;
}
.autocomplete-active {
  /* Kapag ginagamit ang arrow keys para magbukas ng mga item: */
  background-color: DodgerBlue !important;
  kulay: #ffffff;
}

Ika-apat na hakbang - Magdagdag ng JavaScript:

function autocomplete(inp, arr) {
  /* Ang function ng awtomatik na pagkakatuklas ay kailangan ng dalawang argumento, isa ay ang elemento ng tekstong pangalan at isa ay ang array ng mga posibleng halaga na maaaring awtomatikong ilagay: */
  var currentFocus;
  /* Ang function na ito ay gagawin kapag may isang tao na nagpipilang ng teksto sa tekstong pangalan: */
  inp.addEventListener("input", function(e) {
      var a, b, i, val = this.value;
      /* Isara ang anumang bukas na listahan ng awtomatik na halaga: */
      closeAllLists();
      kung walang val { ibabalik false;}
      currentFocus = -1;
      /* Lumikha ng isang DIV na elemento na naglalaman ng mga elemento (halaga): */
      a = document.createElement("DIV");
      a.setAttribute("id", this.id + "autocomplete-list");
      a.setAttribute("class", "autocomplete-items");
      /* I附ila ang DIV na elemento bilang anak ng container ng awtomatik na pagkakatuklas:*/
      this.parentNode.appendChild(a);
      /* Magbubukas ng bawat elemento sa array... */
      for (i = 0; i < arr.length; i++) {
        /* Surhisihin kung ang pangalan ng proyekto ay magkakabuo ng mga letro na katulad ng halaga ng teksto: */
        kung (arr[i].substr(0, val.length).toUpperCase() == val.toUpperCase()) {
          /* Lumikha ng isang DIV element para sa bawat tumutugma na elemento: */
          b = document.createElement("DIV");
          /* Magbigay ng negatibong font ng mga salitang tumutugma: */
          b.innerHTML = "<strong>" + arr[i].substr(0, val.length) + "</strong>";
          b.innerHTML += arr[i].substr(val.length);
          /* I-stra ang isang input field upang isalba ang halaga ng kasalukuyang item ng array: */
          b.innerHTML += "<input type='hidden' value='" + arr[i] + "'>";
          /* Kapag may naklik ang proyekto ng halaga (elementong DIV) na nagpapasimula ng function: */
              b.addEventListener("click", function(e) {
              /* I-stra ang halaga ng teksto ng awtomatikong kompletasyon: */
              inp.value = this.getElementsByTagName("input")[0].value;
              /* Isara ang listahan ng awtomatikong kompletasyon, o anumang ibang buksan na listahan ng awtomatikong kompletasyon: */
              closeAllLists();
          });
          a.appendChild(b);
        }
      }
  });
  /* Kapag may nagpapakabit ng button sa keyboard, isasagawa ang isang function:*/
  inp.addEventListener("keydown", function(e) {
      var x = document.getElementById(this.id + "autocomplete-list");
      if (x) x = x.getElementsByTagName("div");
      if (e.keyCode == 40) {
        /* Kapag napanindigan ang button na ilang araw, dagdagan ang variable na currentFocus:*/
        currentFocus++;
        /* At gawing mas malinaw ang kasalukuyang proyekto:*/
        addActive(x);
      } else if (e.keyCode == 38) { //up
        /* Kapag napanindigan ang button na itaas ang isang araw, bawasan ang variable na currentFocus:*/
        currentFocus--;
        /* At gawing mas malinaw ang kasalukuyang proyekto:*/
        addActive(x);
      } else if (e.keyCode == 13) {
        /* Kapag napanindigan ang BUTTON ENTER, pigilan ang pagsumite ng porma:*/
        e.preventDefault();
        if (currentFocus > -1) {
          /* 并模拟点击“活动”项目:*/
          if (x) x[currentFocus].click();
        }
      }
  });
  function addActive(x) {
    /* 将项目分类为“活动”的函数:*/
    if (!x) return false;
    /* 首先删除所有项目中的 "active" 类:*/
    removeActive(x);
    if (currentFocus >= x.length) currentFocus = 0;
    if (currentFocus < 0) currentFocus = (x.length - 1);
    /* 添加 "autocomplete-active" 类:*/
    x[currentFocus].classList.add("autocomplete-active");
  }
  function removeActive(x) {
    /* 从所有自动完成项中删除 "active" 类的函数:*/
    for (var i = 0; i < x.length; i++) {
      x[i].classList.remove("autocomplete-active");
    }
  }
  function closeAllLists(elmnt) {
    /*关闭文档中的所有自动完成列表,除了作为参数传递的那个:*/
    var x = document.getElementsByClassName("autocomplete-items");
    for (var i = 0; i < x.length; i++) {
      if (elmnt != x[i] && elmnt != inp) {
      x[i].parentNode.removeChild(x[i]);
    }
  }
}
/* 当有人单击文档时执行的函数*/
document.addEventListener("click", function (e) {
    closeAllLists(e.target);
});
}

第五步 - 在 "myInput" 上启用自动完成功能:

将国家数组作为 autocomplete 函数的第二个参数传递:

<script>
autocomplete(document.getElementById("myInput"), countries);
</script>

亲自试一试