Bagaimana untuk membuat auto-completion

Belajar bagaimana untuk membuat fungsi auto-completion.

Auto-completion

Mulakan dengan mengetik:

Try It Yourself

Buat form auto-completion

Langkah pertama - Tambahkan HTML:

<!-- Pastikan form telah mematikan fungsi auto-completion: -->
<form autocomplete="off" action="/action_page.php">
  <div class="autocomplete" style="width:300px;">
    <input id="myInput" type="text" name="myCountry" placeholder="Negara">
  </div>
  <input type="submit">
</form>

Langkah kedua - Buat array JavaScript:

数组 yang mengandungi semua negara/daerah di dunia:

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 African Republic","Chad","Chile","China","Colombia","Congo","Cook Islands","Costa Rica, Koteh D Ivoire, Kroatia, Kuba, Curacao, Siprus, Czech Republic, Denmark, Djibouti, Dominika, Dominican Republic, Ekuador, Mesir, El Salvador, Guinea Khatulistiwa, Eritrea, Estonia, Ethiopia, Pulau Kepung, Pulau Faroe, Fiji, Finland, Perancis, Perancis Polinesia, Perancis Barat, Gabon, Gambia, Georgia, Jerman, Ghana, Gibraltar, Yunani, Grenland, Grenada, Guam, Guatemala, Guernsey, Guinea, Guinea-Bissau, Guyana, Haiti, Honduras, Hong Kong, Hungary, 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;
  keluasan: 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;
  kanan: 0;
}
.autocomplete-items div {
  keluasan: 10px;
  pengekor: pointer;
  warna latar belakang: #fff;
  batang bawah: 1px solid #d4d4d4;
}
.autocomplete-items div:hover {
  /* Apabila tetikus diatur di atas item: */
  warna latar belakang: #e9e9e9;
}
.autocomplete-active {
  /* Apabila digunakan papan kejohanan untuk melihat item: */
  warna latar belakang: DodgerBlue !important;
  warna: #ffffff;
}

Langkah keempat - Tambahkan JavaScript:

function autocomplete(inp, arr) {
  /* Fungsi pengisian otomatis memerlukan dua parameter, iaitu elemen medan teks dan senarai nilai yang boleh diisi otomatis: */
  var currentFocus;
  /* Fungsi yang akan dijalankan apabila seseorang menulis di medan teks: */
  inp.addEventListener("input", function(e) {
      var a, b, i, val = this.value;
      /* Menutup senarai nilai pengisian otomatis yang sudah dibuka: */
      closeAllLists();
      jika (!val) { kembalikan false;}
      currentFocus = -1;
      /* Membuat elemen DIV yang mengandungi item (nilai): */
      a = document.createElement("DIV");
      a.setAttribute("id", this.id + "autocomplete-list");
      a.setAttribute("class", "autocomplete-items");
      /* Menambahkan elemen DIV ini sebagai anak kontainer pengisian otomatis:*/
      this.parentNode.appendChild(a);
      /* Melintasi setiap item di dalam array... */
      untuk (i = 0; i < arr.length; i++) {
        /* Memeriksa sama ada item adalah dengan huruf awal yang sama seperti nilai medan teks: */
        jika (arr[i].substr(0, val.length).toUpperCase() == val.toUpperCase()) {
          /* Buat elemen DIV untuk setiap elemen yang cocok: */
          b = document.createElement("DIV");
          /* Taruh huruf yang cocok dalam bold: */
          b.innerHTML = "<strong>" + arr[i].substr(0, val.length) + "</strong>";
          b.innerHTML += arr[i].substr(val.length);
          /* Masukkan field input untuk menyimpan nilai item array saat ini: */
          b.innerHTML += "<input type='hidden' value='" + arr[i] + "'>";
          /* Saat seseorang mengklik nilai item (element DIV) yang dijalankan fungsi: */
              b.addEventListener("click", function(e) {
              /* Masukkan nilai field teks auto-complete: */
              inp.value = this.getElementsByTagName("input")[0].value;
              /* Tutup daftar nilai auto-complete, atau mana saja daftar nilai auto-complete yang terbuka lainnya: */
              closeAllLists();
          });
          a.appendChild(b);
        }
      }
  });
  /* Saat seseorang menekan tombol papan ketik, eksekusi fungsi: */
  inp.addEventListener("keydown", function(e) {
      var x = document.getElementById(this.id + "autocomplete-list");
      if (x) x = x.getElementsByTagName("div");
      if (e.keyCode == 40) {
        /* Jika ditekan tombol panah ke bawah, menambahkan variabel currentFocus: */
        currentFocus++;
        /* Juga membuat item saat ini lebih jelas: */
        addActive(x);
      } else if (e.keyCode == 38) { //up
        /* Jika ditekan tombol panah ke atas, mengurangi variabel currentFocus: */
        currentFocus--;
        /* Juga membuat item saat ini lebih jelas: */
        addActive(x);
      } else if (e.keyCode == 13) {
        /* Jika ditekan tombol ENTER, pencegah pengiriman formulir: */
        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>

Try It Yourself