1 <!DOCTYPE HTML>
2 <html>
3 <head>
4 <meta charset = "utf-8">
5 <title>JS实现联想自动补齐功能</title>
6 <style>
7 * { box-sizing: border-box; }
8 #container{
9
10 position:relative;
11 top:50px;
12 left:30%;
13 /*为了好看一点定个位*/
14
15 }
16 form{
17 padding:6px;
18 position:absolute;
19 top:200px;
20 left:50px;
21 }
22 #search{
23 border: 1px solid transparent;
24 background-color: #f1f1f1;
25 padding: 10px;
26 font-size: 16px;
27 }
28 button{
29 background-color: DodgerBlue;
30 color: #fff;
31 width:60px;
32 height:40px;
33 padding:10px;
34 }
35 //好了虽然丑了点,更能还是有了
36 .listclass {
37 position: absolute;
38 border: 1px solid #d4d4d4;
39 border-bottom: none;
40 border-top: none;
41 z-index: 99;
42
43 top: 100%;
44 left: 0;
45 right: 0;
46 }
47 .listclass div {
48 padding: 10px;
49 cursor: pointer;
50 background-color: #fff;
51 border-bottom: 1px solid #d4d4d4;
52 }
53 .listclass div:hover {
54
55 background-color: #e9e9e9;
56 }
57 .listactive {
58
59 background-color: DodgerBlue !important;
60 color: #ffffff;
61 }
62 </style>
63 </head>
64 <body>
65 <div id="container">
66 <h3>HTML5的表单是有自动不全功能的,(所以可以只做输入和数据对比过滤就可以)<h3>
67 <h3>这里我们先把补齐更能关闭了用autocomplete属性来实现</h3>
68 <form autocomplete="off" action="https://www.baidu.com/s?" id>
69
70 <div >
71 <input id="search" name="search" placeholder="输入国家或者地区的英文名">
72 <button type="submit" >提交</button>
73 </div>
74
75 </form>
76 </div>
77 <script>
78 //筛选函数
79 function search(arr){
80 //将数据传入,预处理一下
81
82 var currentFocus;//用来计算输入几个
83 var inp=document.getElementById("search");
84 //当输入时,开始筛选,注册一个输入
85 inp.addEventListener("input",function(event){
86 var a,b,i,val=this.value;
87 //当失去焦点后关闭下拉列表
88 closeAll();
89 if(!val){return false;}
90 currentFocus=-1;
91 //把数据例表搞出来
92 a=document.createElement("div");
93 a.setAttribute("id",this.id+"list");
94 a.setAttribute("class","listclass");
95 //添加这个div
96 inp.parentNode.appendChild(a);
97 //开始循环匹配数据
98 for(i=0;i<arr.length;i++){
99 //这个只能顺序匹配,匹配第一个后第二个有效继续,无效为空,
100 if (arr[i].substr(0, val.length).toUpperCase() == val.toUpperCase()) {
101 b = document.createElement("div");
102 b.innerHTML = "<strong>" + arr[i].substr(0, val.length) + "</strong>";
103 b.innerHTML += arr[i].substr(val.length);
104 b.innerHTML += "<input type='hidden' value='" + arr[i] + "'>";
105 b.addEventListener("click", function(e) {
106
107 inp.value = this.getElementsByTagName("input")[0].value;
108 console.log(this)
109 closeAll();
110 });
111 a.appendChild(b);
112 }
113 }
114 });
115 //按键按下时将数据放到输入框
116 inp.addEventListener("keydown", function(e) {
117 var x = document.getElementById(this.id + "list");
118 if (x) x = x.getElementsByTagName("div");
119 if (e.keyCode == 40) {
120 currentFocus++;
121 addActive(x);
122 } else if (e.keyCode == 38) {
123 currentFocus--;
124 addActive(x);
125 } else if (e.keyCode == 13) {
126 e.preventDefault();
127 if (currentFocus > -1) {
128
129 if (x) x[currentFocus].click();
130 }
131 }
132 });
133 function addActive(x) {
134
135 if (!x) return false;
136
137 removeActive(x);
138 if (currentFocus >= x.length) currentFocus = 0;
139 if (currentFocus < 0) currentFocus = (x.length - 1);
140
141 x[currentFocus].classList.add("listactive");
142 }
143 //输入框删除已经输入的字符,往后匹配
144 function removeActive(x) {
145
146 for (var i = 0; i < x.length; i++) {
147 x[i].classList.remove("listactive");
148 }
149 }
150 //失去焦点就关闭列表
151 function closeAll(elmnt) {
152 //全部删去
153 var x = document.getElementsByClassName("listclass");
154 for (var i = 0; i < x.length; i++) {
155 if (elmnt != x[i] && elmnt != inp) {
156 x[i].parentNode.removeChild(x[i]);
157 }
158 }
159 }
160 //点击列表外也删除
161 document.addEventListener("click", function (e) {
162 closeAll(e.target);
163 });
164
165
166 }
167
168 //数据
169 var countries = ["Afghanistan","Albania","Algeria","Andorra","Angola","Anguilla","Antigua &
170
171 Barbuda","Argentina","Armenia","Aruba","Australia","Austria","Azerbaijan","Bahamas","Bahrain","Bang
172
173 ladesh","Barbados","Belarus","Belgium","Belize","Benin","Bermuda","Bhutan","Bolivia","Bosnia &
174
175 Herzegovina","Botswana","Brazil","British Virgin Islands","Brunei","Bulgaria","Burkina
176
177 Faso","Burundi","Cambodia","Cameroon","Canada","Cape Verde","Cayman Islands","Central Arfrican
178
179 Republic","Chad","Chile","China","Colombia","Congo","Cook Islands","Costa Rica","Cote D
180
181 Ivoire","Croatia","Cuba","Curacao","Cyprus","Czech
182
183 Republic","Denmark","Djibouti","Dominica","Dominican Republic","Ecuador","Egypt","El
184
185 Salvador","Equatorial Guinea","Eritrea","Estonia","Ethiopia","Falkland Islands","Faroe
186
187 Islands","Fiji","Finland","France","French Polynesia","French West
188
189 Indies","Gabon","Gambia","Georgia","Germany","Ghana","Gibraltar","Greece","Greenland","Grenada","Gu
190
191 am","Guatemala","Guernsey","Guinea","Guinea Bissau","Guyana","Haiti","Honduras","Hong Kong
192
193 China","Hungary","Iceland","India","Indonesia","Iran","Iraq","Ireland","Isle of
194
195 Man","Israel","Italy","Jamaica","Japan","Jersey","Jordan","Kazakhstan","Kenya","Kiribati","Kosovo",
196
197 "Kuwait","Kyrgyzstan","Laos","Latvia","Lebanon","Lesotho","Liberia","Libya","Liechtenstein","Lithua
198
199 nia","Luxembourg","Macau
200
201 China","Macedonia","Madagascar","Malawi","Malaysia","Maldives","Mali","Malta","Marshall
202
203 Islands","Mauritania","Mauritius","Mexico","Micronesia","Moldova","Monaco","Mongolia","Montenegro",
204
205 "Montserrat","Morocco","Mozambique","Myanmar","Namibia","Nauro","Nepal","Netherlands","Netherlands
206
207 Antilles","New Caledonia","New Zealand","Nicaragua","Niger","Nigeria","North
208
209 Korea","Norway","Oman","Pakistan","Palau","Palestine","Panama","Papua New
210
211 Guinea","Paraguay","Peru","Philippines","Poland","Portugal","Puerto
212
213 Rico","Qatar","Reunion","Romania","Russia","Rwanda","Saint Pierre & Miquelon","Samoa","San
214
215 Marino","Sao Tome and Principe","Saudi Arabia","Senegal","Serbia","Seychelles","Sierra
216
217 Leone","Singapore","Slovakia","Slovenia","Solomon Islands","Somalia","South Africa","South
218
219 Korea","South Sudan","Spain","Sri Lanka","St Kitts & Nevis","St Lucia","St
220
221 Vincent","Sudan","Suriname","Swaziland","Sweden","Switzerland","Syria","Taiwan
222
223 China","Tajikistan","Tanzania","Thailand","Timor L'Este","Togo","Tonga","Trinidad &
224
225 Tobago","Tunisia","Turkey","Turkmenistan","Turks & Caicos","Tuvalu","Uganda","Ukraine","United Arab
226
227 Emirates","United Kingdom","United States of America","Uruguay","Uzbekistan","Vanuatu","Vatican
228
229 City","Venezuela","Vietnam","Virgin Islands (US)","Yemen","Zambia","Zimbabwe"];
230
231 /*运行一下函数*/
232 search(countries);
233 </script>
234 </body>
235 </html>