在本教程中,我们将深入探讨很少使用的HTML5<datalist>
元素。它可以实现不需要JavaScript的轻量级,可访问的,跨浏览器的自动完成表单控件。
<select>
<select>
当您希望用户从一小部分选项中进行选择时,HTML5控件是理想的选择。在以下情况下,它们不太实用:
-
有很多选择,例如国家或职位
-
用户想要输入不在列表中的自己的选项
显而易见的解决方案是自动完成控件。这允许用户输入一些字符,这限制了可用于更快选择的选项。
<select>
在您开始输入时会跳到正确的位置,但这并不总是显而易见的。它无法在所有设备(例如触摸屏)上正常工作,并且会在一两秒钟内重置。
开发人员通常会使用许多 JavaScript驱动的解决方案之一,但是自定义自动完成控件并非总是必需的。HTML5<datalist>
元素是轻量级的,可访问的并且没有JavaScript依赖性。您可能听说过越野车或缺乏支持。2021年并非如此,但存在浏览器不一致和警告。
<datalist>
快速开始
从包含200多个选项的列表中选择您的国家/地区是自动完成控件的理想选择。直接在HTML页面中为每个国家/地区定义一个<datalist>
带有子<option>
元素的元素:
<datalist id="countrydata"> <option>Afghanistan</option> <option>Åland Islands</option> <option>Albania</option> <option>Algeria</option> <option>American Samoa</option> <option>Andorra</option> <option>Angola</option> <option>Anguilla</option> <option>Antarctica</option> ...etc...</datalist>
id
然后可以list
在任何<input>
字段中的属性引用数据列表:
<label for="country">country</label><input type="text" list="countrydata" id="country" name="country" size="50" autocomplete="off" />
令人困惑的是,最好进行设置autocomplete="off"
。这样可确保在用户<datalist>
先前在浏览器中输入的值中显示用户的值,但不会显示该值。
结果:
这是Microsoft Edge中的默认渲染。其他应用程序实现了类似的功能,但外观在平台和浏览器上有所不同。
<option>
选项
<option>
通常将标签用作的文本子代:
<datalist id="mylist"> <option>label one</option> <option>label two</option> <option>label three</option></datalist>
使用value
属性会产生相同的结果:
<datalist id="mylist"> <option value="label one" /> <option value="label two" /> <option value="label three" /></datalist>
注意:/>
在HTML5中,斜杠是可选的,尽管它可以帮助防止编码错误。
您还可以使用以下两种格式之一根据所选标签设置值。
选项1:
<datalist id="mylist"> <option value="1">label one</option> <option value="2">label two</option> <option value="3">label three</option></datalist>
选项2:
<datalist id="mylist"> <option value="1" label="label one" /> <option value="2" label="label two" /> <option value="3" label="label three" /></datalist>
在这两种情况下,输入字段都设置为1
,2
或者3
选择了有效选项后,但是用户界面在不同的浏览器中会有所不同:
-
Chrome会显示一个同时包含值和标签的列表。一旦选择一个选项,则仅保留该值。
-
Firefox仅显示带有标签的列表。一旦选择一个选项,它将切换到该值。
-
边缘仅显示值。
以下CodePen示例显示了所有变体:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>HTML5数据列表的轻量级自动完成控件 - Web前端之家www.jiangweishan.com</title> <style> body { font-family: sans-serif; font-size: 100%; color: #222; background-color: #fafafe; margin: 1em; } label, button { display: block; margin-top: 1em; } </style> </head> <body> <h1>Lightweight HTML5 auto-complete</h1> <form id="autoform"> <label for="country1">country 1 (datalist uses <code><option>value</option></code>):</label> <input list="countrydata1" id="country1" name="country1" size="50" autocomplete="off" /> <label for="country2">country 2 (datalist uses <code><option value="value" /></code>):</label> <input list="countrydata2" id="country2" name="country2" size="50" autocomplete="off" /> <label for="country3">country 3 (datalist uses <code><option value="value">name</option></code>):</label> <input list="countrydata3" id="country3" name="country3" size="50" autocomplete="off" /> <label for="country4">country 4 (datalist uses <code><option value="value" label="name" /></code>):</label> <input list="countrydata3" id="country3" name="country3" size="50" autocomplete="off" /> <button type="submit">submit</button> </form> <datalist id="countrydata1"> <option>Afghanistan</option> <option>Åland Islands</option> <option>Albania</option> <option>Algeria</option> <option>American Samoa</option> <option>Andorra</option> <option>Angola</option> <option>Anguilla</option> <option>Antarctica</option> <option>Antigua and Barbuda</option> <option>Argentina</option> <option>Armenia</option> <option>Aruba</option> <option>Australia</option> <option>Austria</option> <option>Azerbaijan</option> <option>Bahamas</option> <option>Bahrain</option> <option>Bangladesh</option> <option>Barbados</option> <option>Belarus</option> <option>Belgium</option> <option>Belize</option> <option>Benin</option> <option>Bermuda</option> <option>Bhutan</option> <option>Bolivia (Plurinational State of)</option> <option>Bonaire, Sint Eustatius and Saba</option> <option>Bosnia and Herzegovina</option> <option>Botswana</option> <option>Bouvet Island</option> <option>Brazil</option> <option>British Indian Ocean Territory</option> <option>Brunei Darussalam</option> <option>Bulgaria</option> <option>Burkina Faso</option> <option>Burundi</option> <option>Cabo Verde</option> <option>Cambodia</option> <option>Cameroon</option> <option>Canada</option> <option>Cayman Islands</option> <option>Central African Republic</option> <option>Chad</option> <option>Chile</option> <option>China</option> <option>Christmas Island</option> <option>Cocos (Keeling) Islands</option> <option>Colombia</option> <option>Comoros</option> <option>Congo</option> <option>Congo, Democratic Republic of the</option> <option>Cook Islands</option> <option>Costa Rica</option> <option>Côte d'Ivoire</option> <option>Croatia</option> <option>Cuba</option> <option>Curaçao</option> <option>Cyprus</option> <option>Czechia</option> <option>Denmark</option> <option>Djibouti</option> <option>Dominica</option> <option>Dominican Republic</option> <option>Ecuador</option> <option>Egypt</option> <option>El Salvador</option> <option>Equatorial Guinea</option> <option>Eritrea</option> <option>Estonia</option> <option>Eswatini</option> <option>Ethiopia</option> <option>Falkland Islands (Malvinas)</option> <option>Faroe Islands</option> <option>Fiji</option> <option>Finland</option> <option>France</option> <option>French Guiana</option> <option>French Polynesia</option> <option>French Southern Territories</option> <option>Gabon</option> <option>Gambia</option> <option>Georgia</option> <option>Germany</option> <option>Ghana</option> <option>Gibraltar</option> <option>Greece</option> <option>Greenland</option> <option>Grenada</option> <option>Guadeloupe</option> <option>Guam</option> <option>Guatemala</option> <option>Guernsey</option> <option>Guinea</option> <option>Guinea-Bissau</option> <option>Guyana</option> <option>Haiti</option> <option>Heard Island and McDonald Islands</option> <option>Holy See</option> <option>Honduras</option> <option>Hong Kong</option> <option>Hungary</option> <option>Iceland</option> <option>India</option> <option>Indonesia</option> <option>Iran (Islamic Republic of)</option> <option>Iraq</option> <option>Ireland</option> <option>Isle of Man</option> <option>Israel</option> <option>Italy</option> <option>Jamaica</option> <option>Japan</option> <option>Jersey</option> <option>Jordan</option> <option>Kazakhstan</option> <option>Kenya</option> <option>Kiribati</option> <option>Korea (Democratic People's Republic of)</option> <option>Korea, Republic of</option> <option>Kuwait</option> <option>Kyrgyzstan</option> <option>Lao People's Democratic Republic</option> <option>Latvia</option> <option>Lebanon</option> <option>Lesotho</option> <option>Liberia</option> <option>Libya</option> <option>Liechtenstein</option> <option>Lithuania</option> <option>Luxembourg</option> <option>Macao</option> <option>Madagascar</option> <option>Malawi</option> <option>Malaysia</option> <option>Maldives</option> <option>Mali</option> <option>Malta</option> <option>Marshall Islands</option> <option>Martinique</option> <option>Mauritania</option> <option>Mauritius</option> <option>Mayotte</option> <option>Mexico</option> <option>Micronesia (Federated States of)</option> <option>Moldova, Republic of</option> <option>Monaco</option> <option>Mongolia</option> <option>Montenegro</option> <option>Montserrat</option> <option>Morocco</option> <option>Mozambique</option> <option>Myanmar</option> <option>Namibia</option> <option>Nauru</option> <option>Nepal</option> <option>Netherlands</option> <option>New Caledonia</option> <option>New Zealand</option> <option>Nicaragua</option> <option>Niger</option> <option>Nigeria</option> <option>Niue</option> <option>Norfolk Island</option> <option>North Macedonia</option> <option>Northern Mariana Islands</option> <option>Norway</option> <option>Oman</option> <option>Pakistan</option> <option>Palau</option> <option>Palestine, State of</option> <option>Panama</option> <option>Papua New Guinea</option> <option>Paraguay</option> <option>Peru</option> <option>Philippines</option> <option>Pitcairn</option> <option>Poland</option> <option>Portugal</option> <option>Puerto Rico</option> <option>Qatar</option> <option>Réunion</option> <option>Romania</option> <option>Russian Federation</option> <option>Rwanda</option> <option>Saint Barthélemy</option> <option>Saint Helena, Ascension and Tristan da Cunha</option> <option>Saint Kitts and Nevis</option> <option>Saint Lucia</option> <option>Saint Martin (French part)</option> <option>Saint Pierre and Miquelon</option> <option>Saint Vincent and the Grenadines</option> <option>Samoa</option> <option>San Marino</option> <option>Sao Tome and Principe</option> <option>Saudi Arabia</option> <option>Senegal</option> <option>Serbia</option> <option>Seychelles</option> <option>Sierra Leone</option> <option>Singapore</option> <option>Sint Maarten (Dutch part)</option> <option>Slovakia</option> <option>Slovenia</option> <option>Solomon Islands</option> <option>Somalia</option> <option>South Africa</option> <option>South Georgia and the South Sandwich Islands</option> <option>South Sudan</option> <option>Spain</option> <option>Sri Lanka</option> <option>Sudan</option> <option>Suriname</option> <option>Svalbard and Jan Mayen</option> <option>Sweden</option> <option>Switzerland</option> <option>Syrian Arab Republic</option> <option>Taiwan, Province of China</option> <option>Tajikistan</option> <option>Tanzania, United Republic of</option> <option>Thailand</option> <option>Timor-Leste</option> <option>Togo</option> <option>Tokelau</option> <option>Tonga</option> <option>Trinidad and Tobago</option> <option>Tunisia</option> <option>Turkey</option> <option>Turkmenistan</option> <option>Turks and Caicos Islands</option> <option>Tuvalu</option> <option>Uganda</option> <option>Ukraine</option> <option>United Arab Emirates</option> <option>United Kingdom of Great Britain and Northern Ireland</option> <option>United States Minor Outlying Islands</option> <option>United States of America</option> <option>Uruguay</option> <option>Uzbekistan</option> <option>Vanuatu</option> <option>Venezuela (Bolivarian Republic of)</option> <option>Viet Nam</option> <option>Virgin Islands (British)</option> <option>Virgin Islands (U.S.)</option> <option>Wallis and Futuna</option> <option>Western Sahara</option> <option>Yemen</option> <option>Zambia</option> <option>Zimbabwe</option> </datalist> <datalist id="countrydata2"> <option value="Afghanistan" /> <option value="Åland Islands" /> <option value="Albania" /> <option value="Algeria" /> <option value="American Samoa" /> <option value="Andorra" /> <option value="Angola" /> <option value="Anguilla" /> <option value="Antarctica" /> <option value="Antigua and Barbuda" /> <option value="Argentina" /> <option value="Armenia" /> <option value="Aruba" /> <option value="Australia" /> <option value="Austria" /> <option value="Azerbaijan" /> <option value="Bahamas" /> <option value="Bahrain" /> <option value="Bangladesh" /> <option value="Barbados" /> <option value="Belarus" /> <option value="Belgium" /> <option value="Belize" /> <option value="Benin" /> <option value="Bermuda" /> <option value="Bhutan" /> <option value="Bolivia (Plurinational State of)" /> <option value="Bonaire, Sint Eustatius and Saba" /> <option value="Bosnia and Herzegovina" /> <option value="Botswana" /> <option value="Bouvet Island" /> <option value="Brazil" /> <option value="British Indian Ocean Territory" /> <option value="Brunei Darussalam" /> <option value="Bulgaria" /> <option value="Burkina Faso" /> <option value="Burundi" /> <option value="Cabo Verde" /> <option value="Cambodia" /> <option value="Cameroon" /> <option value="Canada" /> <option value="Cayman Islands" /> <option value="Central African Republic" /> <option value="Chad" /> <option value="Chile" /> <option value="China" /> <option value="Christmas Island" /> <option value="Cocos (Keeling) Islands" /> <option value="Colombia" /> <option value="Comoros" /> <option value="Congo" /> <option value="Congo, Democratic Republic of the" /> <option value="Cook Islands" /> <option value="Costa Rica" /> <option value="Côte d'Ivoire" /> <option value="Croatia" /> <option value="Cuba" /> <option value="Curaçao" /> <option value="Cyprus" /> <option value="Czechia" /> <option value="Denmark" /> <option value="Djibouti" /> <option value="Dominica" /> <option value="Dominican Republic" /> <option value="Ecuador" /> <option value="Egypt" /> <option value="El Salvador" /> <option value="Equatorial Guinea" /> <option value="Eritrea" /> <option value="Estonia" /> <option value="Eswatini" /> <option value="Ethiopia" /> <option value="Falkland Islands (Malvinas)" /> <option value="Faroe Islands" /> <option value="Fiji" /> <option value="Finland" /> <option value="France" /> <option value="French Guiana" /> <option value="French Polynesia" /> <option value="French Southern Territories" /> <option value="Gabon" /> <option value="Gambia" /> <option value="Georgia" /> <option value="Germany" /> <option value="Ghana" /> <option value="Gibraltar" /> <option value="Greece" /> <option value="Greenland" /> <option value="Grenada" /> <option value="Guadeloupe" /> <option value="Guam" /> <option value="Guatemala" /> <option value="Guernsey" /> <option value="Guinea" /> <option value="Guinea-Bissau" /> <option value="Guyana" /> <option value="Haiti" /> <option value="Heard Island and McDonald Islands" /> <option value="Holy See" /> <option value="Honduras" /> <option value="Hong Kong" /> <option value="Hungary" /> <option value="Iceland" /> <option value="India" /> <option value="Indonesia" /> <option value="Iran (Islamic Republic of)" /> <option value="Iraq" /> <option value="Ireland" /> <option value="Isle of Man" /> <option value="Israel" /> <option value="Italy" /> <option value="Jamaica" /> <option value="Japan" /> <option value="Jersey" /> <option value="Jordan" /> <option value="Kazakhstan" /> <option value="Kenya" /> <option value="Kiribati" /> <option value="Korea (Democratic People's Republic of)" /> <option value="Korea, Republic of" /> <option value="Kuwait" /> <option value="Kyrgyzstan" /> <option value="Lao People's Democratic Republic" /> <option value="Latvia" /> <option value="Lebanon" /> <option value="Lesotho" /> <option value="Liberia" /> <option value="Libya" /> <option value="Liechtenstein" /> <option value="Lithuania" /> <option value="Luxembourg" /> <option value="Macao" /> <option value="Madagascar" /> <option value="Malawi" /> <option value="Malaysia" /> <option value="Maldives" /> <option value="Mali" /> <option value="Malta" /> <option value="Marshall Islands" /> <option value="Martinique" /> <option value="Mauritania" /> <option value="Mauritius" /> <option value="Mayotte" /> <option value="Mexico" /> <option value="Micronesia (Federated States of)" /> <option value="Moldova, Republic of" /> <option value="Monaco" /> <option value="Mongolia" /> <option value="Montenegro" /> <option value="Montserrat" /> <option value="Morocco" /> <option value="Mozambique" /> <option value="Myanmar" /> <option value="Namibia" /> <option value="Nauru" /> <option value="Nepal" /> <option value="Netherlands" /> <option value="New Caledonia" /> <option value="New Zealand" /> <option value="Nicaragua" /> <option value="Niger" /> <option value="Nigeria" /> <option value="Niue" /> <option value="Norfolk Island" /> <option value="North Macedonia" /> <option value="Northern Mariana Islands" /> <option value="Norway" /> <option value="Oman" /> <option value="Pakistan" /> <option value="Palau" /> <option value="Palestine, State of" /> <option value="Panama" /> <option value="Papua New Guinea" /> <option value="Paraguay" /> <option value="Peru" /> <option value="Philippines" /> <option value="Pitcairn" /> <option value="Poland" /> <option value="Portugal" /> <option value="Puerto Rico" /> <option value="Qatar" /> <option value="Réunion" /> <option value="Romania" /> <option value="Russian Federation" /> <option value="Rwanda" /> <option value="Saint Barthélemy" /> <option value="Saint Helena, Ascension and Tristan da Cunha" /> <option value="Saint Kitts and Nevis" /> <option value="Saint Lucia" /> <option value="Saint Martin (French part)" /> <option value="Saint Pierre and Miquelon" /> <option value="Saint Vincent and the Grenadines" /> <option value="Samoa" /> <option value="San Marino" /> <option value="Sao Tome and Principe" /> <option value="Saudi Arabia" /> <option value="Senegal" /> <option value="Serbia" /> <option value="Seychelles" /> <option value="Sierra Leone" /> <option value="Singapore" /> <option value="Sint Maarten (Dutch part)" /> <option value="Slovakia" /> <option value="Slovenia" /> <option value="Solomon Islands" /> <option value="Somalia" /> <option value="South Africa" /> <option value="South Georgia and the South Sandwich Islands" /> <option value="South Sudan" /> <option value="Spain" /> <option value="Sri Lanka" /> <option value="Sudan" /> <option value="Suriname" /> <option value="Svalbard and Jan Mayen" /> <option value="Sweden" /> <option value="Switzerland" /> <option value="Syrian Arab Republic" /> <option value="Taiwan, Province of China" /> <option value="Tajikistan" /> <option value="Tanzania, United Republic of" /> <option value="Thailand" /> <option value="Timor-Leste" /> <option value="Togo" /> <option value="Tokelau" /> <option value="Tonga" /> <option value="Trinidad and Tobago" /> <option value="Tunisia" /> <option value="Turkey" /> <option value="Turkmenistan" /> <option value="Turks and Caicos Islands" /> <option value="Tuvalu" /> <option value="Uganda" /> <option value="Ukraine" /> <option value="United Arab Emirates" /> <option value="United Kingdom of Great Britain and Northern Ireland" /> <option value="United States Minor Outlying Islands" /> <option value="United States of America" /> <option value="Uruguay" /> <option value="Uzbekistan" /> <option value="Vanuatu" /> <option value="Venezuela (Bolivarian Republic of)" /> <option value="Viet Nam" /> <option value="Virgin Islands (British)" /> <option value="Virgin Islands (U.S.)" /> <option value="Wallis and Futuna" /> <option value="Western Sahara" /> <option value="Yemen" /> <option value="Zambia" /> <option value="Zimbabwe" /> </datalist> <datalist id="countrydata3"> <option value="AF">Afghanistan</option> <option value="AX">Åland Islands</option> <option value="AL">Albania</option> <option value="DZ">Algeria</option> <option value="AS">American Samoa</option> <option value="AD">Andorra</option> <option value="AO">Angola</option> <option value="AI">Anguilla</option> <option value="AQ">Antarctica</option> <option value="AG">Antigua and Barbuda</option> <option value="AR">Argentina</option> <option value="AM">Armenia</option> <option value="AW">Aruba</option> <option value="AU">Australia</option> <option value="AT">Austria</option> <option value="AZ">Azerbaijan</option> <option value="BS">Bahamas</option> <option value="BH">Bahrain</option> <option value="BD">Bangladesh</option> <option value="BB">Barbados</option> <option value="BY">Belarus</option> <option value="BE">Belgium</option> <option value="BZ">Belize</option> <option value="BJ">Benin</option> <option value="BM">Bermuda</option> <option value="BT">Bhutan</option> <option value="BO">Bolivia (Plurinational State of)</option> <option value="BQ">Bonaire, Sint Eustatius and Saba</option> <option value="BA">Bosnia and Herzegovina</option> <option value="BW">Botswana</option> <option value="BV">Bouvet Island</option> <option value="BR">Brazil</option> <option value="IO">British Indian Ocean Territory</option> <option value="BN">Brunei Darussalam</option> <option value="BG">Bulgaria</option> <option value="BF">Burkina Faso</option> <option value="BI">Burundi</option> <option value="CV">Cabo Verde</option> <option value="KH">Cambodia</option> <option value="CM">Cameroon</option> <option value="CA">Canada</option> <option value="KY">Cayman Islands</option> <option value="CF">Central African Republic</option> <option value="TD">Chad</option> <option value="CL">Chile</option> <option value="CN">China</option> <option value="CX">Christmas Island</option> <option value="CC">Cocos (Keeling) Islands</option> <option value="CO">Colombia</option> <option value="KM">Comoros</option> <option value="CG">Congo</option> <option value="CD">Congo, Democratic Republic of the</option> <option value="CK">Cook Islands</option> <option value="CR">Costa Rica</option> <option value="CI">Côte d'Ivoire</option> <option value="HR">Croatia</option> <option value="CU">Cuba</option> <option value="CW">Curaçao</option> <option value="CY">Cyprus</option> <option value="CZ">Czechia</option> <option value="DK">Denmark</option> <option value="DJ">Djibouti</option> <option value="DM">Dominica</option> <option value="DO">Dominican Republic</option> <option value="EC">Ecuador</option> <option value="EG">Egypt</option> <option value="SV">El Salvador</option> <option value="GQ">Equatorial Guinea</option> <option value="ER">Eritrea</option> <option value="EE">Estonia</option> <option value="SZ">Eswatini</option> <option value="ET">Ethiopia</option> <option value="FK">Falkland Islands (Malvinas)</option> <option value="FO">Faroe Islands</option> <option value="FJ">Fiji</option> <option value="FI">Finland</option> <option value="FR">France</option> <option value="GF">French Guiana</option> <option value="PF">French Polynesia</option> <option value="TF">French Southern Territories</option> <option value="GA">Gabon</option> <option value="GM">Gambia</option> <option value="GE">Georgia</option> <option value="DE">Germany</option> <option value="GH">Ghana</option> <option value="GI">Gibraltar</option> <option value="GR">Greece</option> <option value="GL">Greenland</option> <option value="GD">Grenada</option> <option value="GP">Guadeloupe</option> <option value="GU">Guam</option> <option value="GT">Guatemala</option> <option value="GG">Guernsey</option> <option value="GN">Guinea</option> <option value="GW">Guinea-Bissau</option> <option value="GY">Guyana</option> <option value="HT">Haiti</option> <option value="HM">Heard Island and McDonald Islands</option> <option value="VA">Holy See</option> <option value="HN">Honduras</option> <option value="HK">Hong Kong</option> <option value="HU">Hungary</option> <option value="IS">Iceland</option> <option value="IN">India</option> <option value="ID">Indonesia</option> <option value="IR">Iran (Islamic Republic of)</option> <option value="IQ">Iraq</option> <option value="IE">Ireland</option> <option value="IM">Isle of Man</option> <option value="IL">Israel</option> <option value="IT">Italy</option> <option value="JM">Jamaica</option> <option value="JP">Japan</option> <option value="JE">Jersey</option> <option value="JO">Jordan</option> <option value="KZ">Kazakhstan</option> <option value="KE">Kenya</option> <option value="KI">Kiribati</option> <option value="KP">Korea (Democratic People's Republic of)</option> <option value="KR">Korea, Republic of</option> <option value="KW">Kuwait</option> <option value="KG">Kyrgyzstan</option> <option value="LA">Lao People's Democratic Republic</option> <option value="LV">Latvia</option> <option value="LB">Lebanon</option> <option value="LS">Lesotho</option> <option value="LR">Liberia</option> <option value="LY">Libya</option> <option value="LI">Liechtenstein</option> <option value="LT">Lithuania</option> <option value="LU">Luxembourg</option> <option value="MO">Macao</option> <option value="MG">Madagascar</option> <option value="MW">Malawi</option> <option value="MY">Malaysia</option> <option value="MV">Maldives</option> <option value="ML">Mali</option> <option value="MT">Malta</option> <option value="MH">Marshall Islands</option> <option value="MQ">Martinique</option> <option value="MR">Mauritania</option> <option value="MU">Mauritius</option> <option value="YT">Mayotte</option> <option value="MX">Mexico</option> <option value="FM">Micronesia (Federated States of)</option> <option value="MD">Moldova, Republic of</option> <option value="MC">Monaco</option> <option value="MN">Mongolia</option> <option value="ME">Montenegro</option> <option value="MS">Montserrat</option> <option value="MA">Morocco</option> <option value="MZ">Mozambique</option> <option value="MM">Myanmar</option> <option value="NA">Namibia</option> <option value="NR">Nauru</option> <option value="NP">Nepal</option> <option value="NL">Netherlands</option> <option value="NC">New Caledonia</option> <option value="NZ">New Zealand</option> <option value="NI">Nicaragua</option> <option value="NE">Niger</option> <option value="NG">Nigeria</option> <option value="NU">Niue</option> <option value="NF">Norfolk Island</option> <option value="MK">North Macedonia</option> <option value="MP">Northern Mariana Islands</option> <option value="NO">Norway</option> <option value="OM">Oman</option> <option value="PK">Pakistan</option> <option value="PW">Palau</option> <option value="PS">Palestine, State of</option> <option value="PA">Panama</option> <option value="PG">Papua New Guinea</option> <option value="PY">Paraguay</option> <option value="PE">Peru</option> <option value="PH">Philippines</option> <option value="PN">Pitcairn</option> <option value="PL">Poland</option> <option value="PT">Portugal</option> <option value="PR">Puerto Rico</option> <option value="QA">Qatar</option> <option value="RE">Réunion</option> <option value="RO">Romania</option> <option value="RU">Russian Federation</option> <option value="RW">Rwanda</option> <option value="BL">Saint Barthélemy</option> <option value="SH">Saint Helena, Ascension and Tristan da Cunha</option> <option value="KN">Saint Kitts and Nevis</option> <option value="LC">Saint Lucia</option> <option value="MF">Saint Martin (French part)</option> <option value="PM">Saint Pierre and Miquelon</option> <option value="VC">Saint Vincent and the Grenadines</option> <option value="WS">Samoa</option> <option value="SM">San Marino</option> <option value="ST">Sao Tome and Principe</option> <option value="SA">Saudi Arabia</option> <option value="SN">Senegal</option> <option value="RS">Serbia</option> <option value="SC">Seychelles</option> <option value="SL">Sierra Leone</option> <option value="SG">Singapore</option> <option value="SX">Sint Maarten (Dutch part)</option> <option value="SK">Slovakia</option> <option value="SI">Slovenia</option> <option value="SB">Solomon Islands</option> <option value="SO">Somalia</option> <option value="ZA">South Africa</option> <option value="GS">South Georgia and the South Sandwich Islands</option> <option value="SS">South Sudan</option> <option value="ES">Spain</option> <option value="LK">Sri Lanka</option> <option value="SD">Sudan</option> <option value="SR">Suriname</option> <option value="SJ">Svalbard and Jan Mayen</option> <option value="SE">Sweden</option> <option value="CH">Switzerland</option> <option value="SY">Syrian Arab Republic</option> <option value="TW">Taiwan, Province of China</option> <option value="TJ">Tajikistan</option> <option value="TZ">Tanzania, United Republic of</option> <option value="TH">Thailand</option> <option value="TL">Timor-Leste</option> <option value="TG">Togo</option> <option value="TK">Tokelau</option> <option value="TO">Tonga</option> <option value="TT">Trinidad and Tobago</option> <option value="TN">Tunisia</option> <option value="TR">Turkey</option> <option value="TM">Turkmenistan</option> <option value="TC">Turks and Caicos Islands</option> <option value="TV">Tuvalu</option> <option value="UG">Uganda</option> <option value="UA">Ukraine</option> <option value="AE">United Arab Emirates</option> <option value="GB">United Kingdom of Great Britain and Northern Ireland</option> <option value="UM">United States Minor Outlying Islands</option> <option value="US">United States of America</option> <option value="UY">Uruguay</option> <option value="UZ">Uzbekistan</option> <option value="VU">Vanuatu</option> <option value="VE">Venezuela (Bolivarian Republic of)</option> <option value="VN">Viet Nam</option> <option value="VG">Virgin Islands (British)</option> <option value="VI">Virgin Islands (U.S.)</option> <option value="WF">Wallis and Futuna</option> <option value="EH">Western Sahara</option> <option value="YE">Yemen</option> <option value="ZM">Zambia</option> <option value="ZW">Zimbabwe</option> </datalist> <datalist id="countrydata4"> <option value="AF" label="Afghanistan" /> <option value="AX" label="Åland Islands" /> <option value="AL" label="Albania" /> <option value="DZ" label="Algeria" /> <option value="AS" label="American Samoa" /> <option value="AD" label="Andorra" /> <option value="AO" label="Angola" /> <option value="AI" label="Anguilla" /> <option value="AQ" label="Antarctica" /> <option value="AG" label="Antigua and Barbuda" /> <option value="AR" label="Argentina" /> <option value="AM" label="Armenia" /> <option value="AW" label="Aruba" /> <option value="AU" label="Australia" /> <option value="AT" label="Austria" /> <option value="AZ" label="Azerbaijan" /> <option value="BS" label="Bahamas" /> <option value="BH" label="Bahrain" /> <option value="BD" label="Bangladesh" /> <option value="BB" label="Barbados" /> <option value="BY" label="Belarus" /> <option value="BE" label="Belgium" /> <option value="BZ" label="Belize" /> <option value="BJ" label="Benin" /> <option value="BM" label="Bermuda" /> <option value="BT" label="Bhutan" /> <option value="BO" label="Bolivia (Plurinational State of)" /> <option value="BQ" label="Bonaire, Sint Eustatius and Saba" /> <option value="BA" label="Bosnia and Herzegovina" /> <option value="BW" label="Botswana" /> <option value="BV" label="Bouvet Island" /> <option value="BR" label="Brazil" /> <option value="IO" label="British Indian Ocean Territory" /> <option value="BN" label="Brunei Darussalam" /> <option value="BG" label="Bulgaria" /> <option value="BF" label="Burkina Faso" /> <option value="BI" label="Burundi" /> <option value="CV" label="Cabo Verde" /> <option value="KH" label="Cambodia" /> <option value="CM" label="Cameroon" /> <option value="CA" label="Canada" /> <option value="KY" label="Cayman Islands" /> <option value="CF" label="Central African Republic" /> <option value="TD" label="Chad" /> <option value="CL" label="Chile" /> <option value="CN" label="China" /> <option value="CX" label="Christmas Island" /> <option value="CC" label="Cocos (Keeling) Islands" /> <option value="CO" label="Colombia" /> <option value="KM" label="Comoros" /> <option value="CG" label="Congo" /> <option value="CD" label="Congo, Democratic Republic of the" /> <option value="CK" label="Cook Islands" /> <option value="CR" label="Costa Rica" /> <option value="CI" label="Côte d'Ivoire" /> <option value="HR" label="Croatia" /> <option value="CU" label="Cuba" /> <option value="CW" label="Curaçao" /> <option value="CY" label="Cyprus" /> <option value="CZ" label="Czechia" /> <option value="DK" label="Denmark" /> <option value="DJ" label="Djibouti" /> <option value="DM" label="Dominica" /> <option value="DO" label="Dominican Republic" /> <option value="EC" label="Ecuador" /> <option value="EG" label="Egypt" /> <option value="SV" label="El Salvador" /> <option value="GQ" label="Equatorial Guinea" /> <option value="ER" label="Eritrea" /> <option value="EE" label="Estonia" /> <option value="SZ" label="Eswatini" /> <option value="ET" label="Ethiopia" /> <option value="FK" label="Falkland Islands (Malvinas)" /> <option value="FO" label="Faroe Islands" /> <option value="FJ" label="Fiji" /> <option value="FI" label="Finland" /> <option value="FR" label="France" /> <option value="GF" label="French Guiana" /> <option value="PF" label="French Polynesia" /> <option value="TF" label="French Southern Territories" /> <option value="GA" label="Gabon" /> <option value="GM" label="Gambia" /> <option value="GE" label="Georgia" /> <option value="DE" label="Germany" /> <option value="GH" label="Ghana" /> <option value="GI" label="Gibraltar" /> <option value="GR" label="Greece" /> <option value="GL" label="Greenland" /> <option value="GD" label="Grenada" /> <option value="GP" label="Guadeloupe" /> <option value="GU" label="Guam" /> <option value="GT" label="Guatemala" /> <option value="GG" label="Guernsey" /> <option value="GN" label="Guinea" /> <option value="GW" label="Guinea-Bissau" /> <option value="GY" label="Guyana" /> <option value="HT" label="Haiti" /> <option value="HM" label="Heard Island and McDonald Islands" /> <option value="VA" label="Holy See" /> <option value="HN" label="Honduras" /> <option value="HK" label="Hong Kong" /> <option value="HU" label="Hungary" /> <option value="IS" label="Iceland" /> <option value="IN" label="India" /> <option value="ID" label="Indonesia" /> <option value="IR" label="Iran (Islamic Republic of)" /> <option value="IQ" label="Iraq" /> <option value="IE" label="Ireland" /> <option value="IM" label="Isle of Man" /> <option value="IL" label="Israel" /> <option value="IT" label="Italy" /> <option value="JM" label="Jamaica" /> <option value="JP" label="Japan" /> <option value="JE" label="Jersey" /> <option value="JO" label="Jordan" /> <option value="KZ" label="Kazakhstan" /> <option value="KE" label="Kenya" /> <option value="KI" label="Kiribati" /> <option value="KP" label="Korea (Democratic People's Republic of)" /> <option value="KR" label="Korea, Republic of" /> <option value="KW" label="Kuwait" /> <option value="KG" label="Kyrgyzstan" /> <option value="LA" label="Lao People's Democratic Republic" /> <option value="LV" label="Latvia" /> <option value="LB" label="Lebanon" /> <option value="LS" label="Lesotho" /> <option value="LR" label="Liberia" /> <option value="LY" label="Libya" /> <option value="LI" label="Liechtenstein" /> <option value="LT" label="Lithuania" /> <option value="LU" label="Luxembourg" /> <option value="MO" label="Macao" /> <option value="MG" label="Madagascar" /> <option value="MW" label="Malawi" /> <option value="MY" label="Malaysia" /> <option value="MV" label="Maldives" /> <option value="ML" label="Mali" /> <option value="MT" label="Malta" /> <option value="MH" label="Marshall Islands" /> <option value="MQ" label="Martinique" /> <option value="MR" label="Mauritania" /> <option value="MU" label="Mauritius" /> <option value="YT" label="Mayotte" /> <option value="MX" label="Mexico" /> <option value="FM" label="Micronesia (Federated States of)" /> <option value="MD" label="Moldova, Republic of" /> <option value="MC" label="Monaco" /> <option value="MN" label="Mongolia" /> <option value="ME" label="Montenegro" /> <option value="MS" label="Montserrat" /> <option value="MA" label="Morocco" /> <option value="MZ" label="Mozambique" /> <option value="MM" label="Myanmar" /> <option value="NA" label="Namibia" /> <option value="NR" label="Nauru" /> <option value="NP" label="Nepal" /> <option value="NL" label="Netherlands" /> <option value="NC" label="New Caledonia" /> <option value="NZ" label="New Zealand" /> <option value="NI" label="Nicaragua" /> <option value="NE" label="Niger" /> <option value="NG" label="Nigeria" /> <option value="NU" label="Niue" /> <option value="NF" label="Norfolk Island" /> <option value="MK" label="North Macedonia" /> <option value="MP" label="Northern Mariana Islands" /> <option value="NO" label="Norway" /> <option value="OM" label="Oman" /> <option value="PK" label="Pakistan" /> <option value="PW" label="Palau" /> <option value="PS" label="Palestine, State of" /> <option value="PA" label="Panama" /> <option value="PG" label="Papua New Guinea" /> <option value="PY" label="Paraguay" /> <option value="PE" label="Peru" /> <option value="PH" label="Philippines" /> <option value="PN" label="Pitcairn" /> <option value="PL" label="Poland" /> <option value="PT" label="Portugal" /> <option value="PR" label="Puerto Rico" /> <option value="QA" label="Qatar" /> <option value="RE" label="Réunion" /> <option value="RO" label="Romania" /> <option value="RU" label="Russian Federation" /> <option value="RW" label="Rwanda" /> <option value="BL" label="Saint Barthélemy" /> <option value="SH" label="Saint Helena, Ascension and Tristan da Cunha" /> <option value="KN" label="Saint Kitts and Nevis" /> <option value="LC" label="Saint Lucia" /> <option value="MF" label="Saint Martin (French part)" /> <option value="PM" label="Saint Pierre and Miquelon" /> <option value="VC" label="Saint Vincent and the Grenadines" /> <option value="WS" label="Samoa" /> <option value="SM" label="San Marino" /> <option value="ST" label="Sao Tome and Principe" /> <option value="SA" label="Saudi Arabia" /> <option value="SN" label="Senegal" /> <option value="RS" label="Serbia" /> <option value="SC" label="Seychelles" /> <option value="SL" label="Sierra Leone" /> <option value="SG" label="Singapore" /> <option value="SX" label="Sint Maarten (Dutch part)" /> <option value="SK" label="Slovakia" /> <option value="SI" label="Slovenia" /> <option value="SB" label="Solomon Islands" /> <option value="SO" label="Somalia" /> <option value="ZA" label="South Africa" /> <option value="GS" label="South Georgia and the South Sandwich Islands" /> <option value="SS" label="South Sudan" /> <option value="ES" label="Spain" /> <option value="LK" label="Sri Lanka" /> <option value="SD" label="Sudan" /> <option value="SR" label="Suriname" /> <option value="SJ" label="Svalbard and Jan Mayen" /> <option value="SE" label="Sweden" /> <option value="CH" label="Switzerland" /> <option value="SY" label="Syrian Arab Republic" /> <option value="TW" label="Taiwan, Province of China" /> <option value="TJ" label="Tajikistan" /> <option value="TZ" label="Tanzania, United Republic of" /> <option value="TH" label="Thailand" /> <option value="TL" label="Timor-Leste" /> <option value="TG" label="Togo" /> <option value="TK" label="Tokelau" /> <option value="TO" label="Tonga" /> <option value="TT" label="Trinidad and Tobago" /> <option value="TN" label="Tunisia" /> <option value="TR" label="Turkey" /> <option value="TM" label="Turkmenistan" /> <option value="TC" label="Turks and Caicos Islands" /> <option value="TV" label="Tuvalu" /> <option value="UG" label="Uganda" /> <option value="UA" label="Ukraine" /> <option value="AE" label="United Arab Emirates" /> <option value="GB" label="United Kingdom of Great Britain and Northern Ireland" /> <option value="UM" label="United States Minor Outlying Islands" /> <option value="US" label="United States of America" /> <option value="UY" label="Uruguay" /> <option value="UZ" label="Uzbekistan" /> <option value="VU" label="Vanuatu" /> <option value="VE" label="Venezuela (Bolivarian Republic of)" /> <option value="VN" label="Viet Nam" /> <option value="VG" label="Virgin Islands (British)" /> <option value="VI" label="Virgin Islands (U.S.)" /> <option value="WF" label="Wallis and Futuna" /> <option value="EH" label="Western Sahara" /> <option value="YE" label="Yemen" /> <option value="ZM" label="Zambia" /> <option value="ZW" label="Zimbabwe" /> </datalist> <script> (() => { // stop form submission and output field names/values to console const form = document.getElementById('autoform'); form.addEventListener('submit', e => { e.preventDefault(); console.clear(); console.log('Submit disabled. Data:'); const data = new FormData(form); for (let nv of data.entries()) { console.log(` ${ nv[0] }: ${ nv[1] }`); } }); })(); </script> </body> </html>
实现会不断发展,但就目前而言,我建议您不要使用值和标签,因为它可能会使用户感到困惑。
<datalist>
浏览器支持和后备
<datalist>
现代浏览器以及Internet Explorer 10和11都很好地支持该元素:
有几个实现说明,但是它们不会影响大多数使用情况。可能发生的最坏情况是字段恢复为标准文本输入。
如果您绝对必须支持IE9及以下版本,则有一个后备模式,该模式<select>
在<datalist>
失败时将标准与文本输入结合使用。改写国家示例:
<label for="country">country</label><datalist id="countrydata"> <select name="countryselect"> <option></option> <option>Afghanistan</option> <option>Åland Islands</option> <option>Albania</option> <option>Algeria</option> <option>American Samoa</option> <option>Andorra</option> <option>Angola</option> <option>Anguilla</option> <option>Antarctica</option> ...etc... </select> <label for="country">or other</label></datalist><input type="text" id="country" name="country" size="50" list="countrydata" autocomplete="off" />
看下DEMO:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>HTML5数据列表的轻量级自动完成控件 - Web前端之家www.jiangweishan.com</title> <style> body { font-family: sans-serif; font-size: 100%; color: #222; background-color: #fafafe; margin: 1em; } label, button { display: block; margin-top: 1em; } </style> </head> <body> <h1>Lightweight HTML5 datalist fallback</h1> <p>Works in all browsers including IE9 and below which do not support datalist elements.</p> <form id="autoform"> <label for="country">country</label> <datalist id="countrydata"> <select name="countryselect"> <option></option> <option>Afghanistan</option> <option>Åland Islands</option> <option>Albania</option> <option>Algeria</option> <option>American Samoa</option> <option>Andorra</option> <option>Angola</option> <option>Anguilla</option> <option>Antarctica</option> <option>Antigua and Barbuda</option> <option>Argentina</option> <option>Armenia</option> <option>Aruba</option> <option>Australia</option> <option>Austria</option> <option>Azerbaijan</option> <option>Bahamas</option> <option>Bahrain</option> <option>Bangladesh</option> <option>Barbados</option> <option>Belarus</option> <option>Belgium</option> <option>Belize</option> <option>Benin</option> <option>Bermuda</option> <option>Bhutan</option> <option>Bolivia (Plurinational State of)</option> <option>Bonaire, Sint Eustatius and Saba</option> <option>Bosnia and Herzegovina</option> <option>Botswana</option> <option>Bouvet Island</option> <option>Brazil</option> <option>British Indian Ocean Territory</option> <option>Brunei Darussalam</option> <option>Bulgaria</option> <option>Burkina Faso</option> <option>Burundi</option> <option>Cabo Verde</option> <option>Cambodia</option> <option>Cameroon</option> <option>Canada</option> <option>Cayman Islands</option> <option>Central African Republic</option> <option>Chad</option> <option>Chile</option> <option>China</option> <option>Christmas Island</option> <option>Cocos (Keeling) Islands</option> <option>Colombia</option> <option>Comoros</option> <option>Congo</option> <option>Congo, Democratic Republic of the</option> <option>Cook Islands</option> <option>Costa Rica</option> <option>Côte d'Ivoire</option> <option>Croatia</option> <option>Cuba</option> <option>Curaçao</option> <option>Cyprus</option> <option>Czechia</option> <option>Denmark</option> <option>Djibouti</option> <option>Dominica</option> <option>Dominican Republic</option> <option>Ecuador</option> <option>Egypt</option> <option>El Salvador</option> <option>Equatorial Guinea</option> <option>Eritrea</option> <option>Estonia</option> <option>Eswatini</option> <option>Ethiopia</option> <option>Falkland Islands (Malvinas)</option> <option>Faroe Islands</option> <option>Fiji</option> <option>Finland</option> <option>France</option> <option>French Guiana</option> <option>French Polynesia</option> <option>French Southern Territories</option> <option>Gabon</option> <option>Gambia</option> <option>Georgia</option> <option>Germany</option> <option>Ghana</option> <option>Gibraltar</option> <option>Greece</option> <option>Greenland</option> <option>Grenada</option> <option>Guadeloupe</option> <option>Guam</option> <option>Guatemala</option> <option>Guernsey</option> <option>Guinea</option> <option>Guinea-Bissau</option> <option>Guyana</option> <option>Haiti</option> <option>Heard Island and McDonald Islands</option> <option>Holy See</option> <option>Honduras</option> <option>Hong Kong</option> <option>Hungary</option> <option>Iceland</option> <option>India</option> <option>Indonesia</option> <option>Iran (Islamic Republic of)</option> <option>Iraq</option> <option>Ireland</option> <option>Isle of Man</option> <option>Israel</option> <option>Italy</option> <option>Jamaica</option> <option>Japan</option> <option>Jersey</option> <option>Jordan</option> <option>Kazakhstan</option> <option>Kenya</option> <option>Kiribati</option> <option>Korea (Democratic People's Republic of)</option> <option>Korea, Republic of</option> <option>Kuwait</option> <option>Kyrgyzstan</option> <option>Lao People's Democratic Republic</option> <option>Latvia</option> <option>Lebanon</option> <option>Lesotho</option> <option>Liberia</option> <option>Libya</option> <option>Liechtenstein</option> <option>Lithuania</option> <option>Luxembourg</option> <option>Macao</option> <option>Madagascar</option> <option>Malawi</option> <option>Malaysia</option> <option>Maldives</option> <option>Mali</option> <option>Malta</option> <option>Marshall Islands</option> <option>Martinique</option> <option>Mauritania</option> <option>Mauritius</option> <option>Mayotte</option> <option>Mexico</option> <option>Micronesia (Federated States of)</option> <option>Moldova, Republic of</option> <option>Monaco</option> <option>Mongolia</option> <option>Montenegro</option> <option>Montserrat</option> <option>Morocco</option> <option>Mozambique</option> <option>Myanmar</option> <option>Namibia</option> <option>Nauru</option> <option>Nepal</option> <option>Netherlands</option> <option>New Caledonia</option> <option>New Zealand</option> <option>Nicaragua</option> <option>Niger</option> <option>Nigeria</option> <option>Niue</option> <option>Norfolk Island</option> <option>North Macedonia</option> <option>Northern Mariana Islands</option> <option>Norway</option> <option>Oman</option> <option>Pakistan</option> <option>Palau</option> <option>Palestine, State of</option> <option>Panama</option> <option>Papua New Guinea</option> <option>Paraguay</option> <option>Peru</option> <option>Philippines</option> <option>Pitcairn</option> <option>Poland</option> <option>Portugal</option> <option>Puerto Rico</option> <option>Qatar</option> <option>Réunion</option> <option>Romania</option> <option>Russian Federation</option> <option>Rwanda</option> <option>Saint Barthélemy</option> <option>Saint Helena, Ascension and Tristan da Cunha</option> <option>Saint Kitts and Nevis</option> <option>Saint Lucia</option> <option>Saint Martin (French part)</option> <option>Saint Pierre and Miquelon</option> <option>Saint Vincent and the Grenadines</option> <option>Samoa</option> <option>San Marino</option> <option>Sao Tome and Principe</option> <option>Saudi Arabia</option> <option>Senegal</option> <option>Serbia</option> <option>Seychelles</option> <option>Sierra Leone</option> <option>Singapore</option> <option>Sint Maarten (Dutch part)</option> <option>Slovakia</option> <option>Slovenia</option> <option>Solomon Islands</option> <option>Somalia</option> <option>South Africa</option> <option>South Georgia and the South Sandwich Islands</option> <option>South Sudan</option> <option>Spain</option> <option>Sri Lanka</option> <option>Sudan</option> <option>Suriname</option> <option>Svalbard and Jan Mayen</option> <option>Sweden</option> <option>Switzerland</option> <option>Syrian Arab Republic</option> <option>Taiwan, Province of China</option> <option>Tajikistan</option> <option>Tanzania, United Republic of</option> <option>Thailand</option> <option>Timor-Leste</option> <option>Togo</option> <option>Tokelau</option> <option>Tonga</option> <option>Trinidad and Tobago</option> <option>Tunisia</option> <option>Turkey</option> <option>Turkmenistan</option> <option>Turks and Caicos Islands</option> <option>Tuvalu</option> <option>Uganda</option> <option>Ukraine</option> <option>United Arab Emirates</option> <option>United Kingdom of Great Britain and Northern Ireland</option> <option>United States Minor Outlying Islands</option> <option>United States of America</option> <option>Uruguay</option> <option>Uzbekistan</option> <option>Vanuatu</option> <option>Venezuela (Bolivarian Republic of)</option> <option>Viet Nam</option> <option>Virgin Islands (British)</option> <option>Virgin Islands (U.S.)</option> <option>Wallis and Futuna</option> <option>Western Sahara</option> <option>Yemen</option> <option>Zambia</option> <option>Zimbabwe</option> </select> <label for="country">or other:</label> </datalist> <input list="countrydata" id="country" name="country" size="50" autocomplete="off" /> <button type="submit">submit</button> </form> <script> (() => { // stop form submission and output field names/values to console const form = document.getElementById('autoform'); form.addEventListener('submit', e => { e.preventDefault(); console.clear(); console.log('Submit disabled. Data:'); const data = new FormData(form); for (let nv of data.entries()) { console.log(` ${ nv[0] }: ${ nv[1] }`); } }); })(); </script> </body> </html>
在现代浏览器中,<option>
元素成为的一部分,<datalist>
并且未显示“或其他”标签。它看起来与上面的示例相同,但是countryselect
表单值将设置为空字符串。
在IE9及以下版本中,(很长)<select>
和文本输入字段均处于活动状态:
这两个值都可以在旧的IE中输入。您的应用程序必须:
-
决定哪个最有效,或者
-
使用小的JavaScript函数在另一个更改时重置一个
使用<datalist>
非文本控件
基于Chrome的浏览器还可将<datalist>
值应用于:
-
类型为的输入
"date"
。用户可以从定义为YYYY-MM-DD
值但以其区域设置格式显示的一系列选项中进行选择。 -
类型为的输入
"color"
。用户可以从定义为六位十六进制值(三位数值无效)的颜色选项中进行选择。 -
类型为的输入
"range"
。滑块显示刻度线,尽管这并不限制可以输入哪个值。
<datalist>
CSS样式
如果您在设计<select>
包装盒时遇到困难,……就很简单!
一个<input>
可以作为样式正常,但一个链接<datalist>
和其子<option>
元素不能在CSS定义样式。列表呈现完全由平台和浏览器确定。
我希望这种情况有所改善,但目前,MDN提出了一种解决方案,该解决方案是:
-
覆盖默认的浏览器行为
-
有效地对待
<datalist>
a,<div>
因此可以在CSS中设置样式 -
复制JavaScript中的所有自动完成功能
我已经对其进行了进一步的增强,并且代码可以在GitHub上找到。要使用它,请将脚本作为ES6模块加载到HTML页面中的任何位置。该jsDelivr CDN URL,可以用:
<script src="https://cdn.jsdelivr.net/npm/datalist-css/dist/datalist-css.min.js"></script>
或者,npm
如果您使用捆绑器,则可以将其安装:
npm install datalist-css
您的<datalist>
元素必须使用<option>value</option>
格式。例如:
<datalist id="mylist"> <option>label one</option> <option>label two</option> <option>label three</option></datalist>
注意:<option value="value" />
不能使用,因为它会导致无法设置样式的空元素!
然后可以添加CSS来为部分或全部<datalist>
和<option>
元素设置样式。例如:
datalist { position: absolute; max-height: 20em; border: 0 none; overflow-x: hidden; overflow-y: auto;}datalist option { font-size: 0.8em; padding: 0.3em 1em; background-color: #ccc; cursor: pointer;}/* active option styling */datalist option:hover, datalist option:focus { color: #fff; background-color: #036; outline: 0 none;}
样式有效,但是值得付出努力吗?我怀疑不是……
-
很难以合理的可访问性重新实现浏览器的标准键盘,鼠标和触摸控件。该MDN例如不支持键盘事件,而我试图在某些设备上对其进行改进,难免会出现问题。
-
您依靠200行JavaScript来解决CSS问题。它最小化为1.5kB,但是如果您
<datalist>
在同一页面上需要许多长元素,则可能会导致性能问题。 -
如果需要JavaScript,是否最好使用更漂亮,更一致,经过考验的JavaScript组件?
<datalist>
当JavaScript失败时,控件会退回到标准HTML5而不设置样式,但这是次要的好处。
创建增强的Ajax <datalist>
假设您的设计师乐于接受浏览器样式上的差异,则可以<datalist>
使用JavaScript增强标准功能。例如:
-
实现可选验证,该验证仅接受中的已知值
<datalist>
。 -
<option>
从Ajax调用返回的数据中设置元素以搜索API。 -
选择一个选项时,设置其他字段值。例如,选择“美国”会在隐藏的输入中设置“美国”。
<option>
尽管有一些编码注意事项,但是代码主要需要重新定义元素:
-
输入最少字符数后,才应发出Ajax API请求。
-
键入事件应予以消除。也就是说,仅在用户停止键入至少半秒钟后才触发Ajax调用。
-
查询结果应该被缓存,因此没有必要重复或解析相同的调用。
-
应避免不必要的查询。例如,输入“ un”将返回12个国家。有没有必要做进一步的Ajax调用“单位”或“联合”,因为所有结果选项都包含在最初的12个结果。
我已经为此创建了一个标准的Web组件,并且代码可以在GitHub上找到。下面的CodePen示例允许您输入至少两个字符后选择有效的国家/地区。然后,音乐艺术家自动完成功能会返回来自该国家/地区且名称与搜索字符串匹配的艺术家:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>HTML5数据列表的轻量级自动完成控件 - Web前端之家www.jiangweishan.com</title> <style> *, *::before, *::after { box-sizing: border-box; } body { font-family: sans-serif; font-size: 100%; color: #222; background-color: #fafafe; margin: 1em; } label, button { display: block; margin-top: 1em; } </style> </head> <body> <h1>HTML5 Ajax auto-complete datalist demonstration</h1> <form id="autoform"> <label for="country">country lookup:</label> <auto-complete api="https://restcountries.eu/rest/v2/name/${country}?fields=name;alpha2Code;region" resultname="name" querymin="2" optionmax="50" valid="please select a valid country" > <input type="text" id="country" name="country" size="50" required /> </auto-complete> <label for="region">country region:</label> <input type="text" id="region" name="region" size="10" data-autofill="region" readonly /> <label for="countrycode">country code:</label> <input type="text" id="countrycode" name="countrycode" data-autofill="alpha2Code" size="2" readonly /> <label for="artist">music artist lookup:</label> <auto-complete api="https://musicbrainz.org/ws/2/artist?query=artist:${artist}%20AND%20country:${countrycode}&limit=21&fmt=json" resultdata="artists" resultname="name" querymin="1" optionmax="100" > <input type="text" id="artist" name="artist" size="50" required /> </auto-complete> <label for="artisttype">artist type:</label> <input type="text" id="artisttype" name="artisttype" data-autofill="type" size="10" readonly /> <button type="submit">submit</button> </form> <script> (() => { // stop form submission and output field names/values to console const form = document.getElementById('autoform'); form.addEventListener('submit', e => { e.preventDefault(); console.clear(); console.log('Submit disabled. Data:'); const data = new FormData(form); for (let nv of data.entries()) { console.log(` ${ nv[0] }: ${ nv[1] }`); } }); })(); </script> </body> </html>
要在您自己的应用程序中使用它,请将脚本作为ES6模块加载到HTML页面中的任何位置。该jsDelivr CDN URL,可以用:
<script src="https://cdn.jsdelivr.net/npm/datalist-ajax/dist/datalist-ajax.min.js"></script>
或者,npm
如果您使用捆绑器,则可以将其安装:
npm install datalist-ajax
创建一个<auto-complete>
带有子元素的元素,<input>
以用作数据输入字段。例如,国家/地区查询使用以下代码:
<label for="country">country lookup:</label><auto-complete api="https://restcountries.eu/rest/v2/name/${country}?fields=name;alpha2Code;region" resultname="name" querymin="2" optionmax="50" valid="please select a valid country"> <input type="text" id="country" name="country" size="50" required /></auto-complete>
<auto-complete>
元素属性:
属性 | 描述 |
---|---|
api |
REST API URL(必需) |
resultdata |
在返回的API JSON中包含对象结果数组的属性的名称(如果仅返回结果,则不需要) |
resultname |
每个结果对象中与搜索输入匹配的属性名称,用于数据列表<option> 元素(必需) |
querymin |
触发搜索之前输入的最少字符数(默认值:1) |
inputdelay |
搜索之前在两次按键之间等待的最短时间(以毫秒为单位)(默认的反跳:300) |
optionmax |
显示的自动完成选项的最大数量(默认值:20) |
valid |
如果设置,则选择无效值时将显示此错误消息 |
其余URL必须包含至少一个${id}
标识符,它是通过在设定的值取代<input>
与id
。在上面的示例${country}
中,api
URL引用了child中的值<input>
,其id
值为"country"
。该URL通常将使用子输入,但是可以引用页面上的任何其他字段。
所述restcountries.eu API返回单个对象或包含国家数据对象的数组。例如:
[ { "name": "Cyprus", "alpha2Code": "CY", "region": "Europe" }, { "name": "Sao Tome and Principe", "alpha2Code": "ST", "region": "Africa" }, { "name": "Andorra", "alpha2Code": "AD", "region": "Europe" }]
resultdata
不需要设置该属性,因为这是唯一返回的数据(没有包装对象)。该resultname
属性必须设置为,"name"
因为该属性用于填充数据列表<option>
元素。
选择选项后,其他字段可以自动填写。以下输入接收到"alpha2Code"
和"region"
属性数据,因为data-autofill
已经设置了属性:
<input data-autofill="alpha2Code" type="text" id="countrycode" name="countrycode" readonly /><input data-autofill="region" type="text" id="region" name="region" readonly />
datalist-ajax如何
工作
如果您不想阅读230行代码并保持魔力,则可以跳过本节。
该代码首先创建一个新的<datalist>
内<auto-complete>
,它重视孩子<input>
使用list
属性。一个input
事件处理程序监控<input>
和调用runQuery()
时已经输入的字符的最小数目,并且用户仍然不打字功能。
runQuery()
根据表单中的数据构建API URL,并使用Fetch API进行Ajax调用。解析返回的JSON,然后<option>
构造一个包含元素的可重用DOM片段并将其放入缓存。
datalistUpdate()
调用一个函数,该函数<datalist>
使用适当的缓存DOM片段更新。runQuery()
如果查询已经被缓存或可以使用先前的查询,则可以进行进一步的调用以避免Ajax调用。
甲change
事件处理程序还监控<input>
,其中,当焦点被从场移动,且值已被修改时被触发。该函数检查该值是否与已知选项匹配,并在必要时使用约束验证API来显示valid
属性中提供的错误消息。
假设已选择一个有效选项,那么更改处理程序功能将使用匹配的data-autofill
属性填充所有字段。保留了对自动填充字段的引用,因此,如果随后输入了无效的选项,可以将其重置。
请注意,未使用影子DOM 。这样可以确保自动完成元素<input>
(和<datalist>
)可以由CSS设置样式,并在需要时由其他脚本访问。
<datalist>
HTML5<datalist>
有局限性,但是如果您需要一个与框架无关的简单自动完成字段,则它是理想的选择。缺乏CSS支持是一个遗憾,但是浏览器供应商最终可能会解决这种疏忽。
本教程中显示的任何代码和示例都可以用于您自己的项目。