51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

HTML5数据列表:轻量级自动完成控件

在本教程中,我们将深入探讨很少使用的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>先前在浏览器中输入的值中显示用户的值,但不会显示该值。

结果:

1611572201datalist-country.gif

这是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>

在这两种情况下,输入字段都设置为12或者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>&lt;option&gt;value&lt;/option&gt;</code>):</label>
    <input list="countrydata1" id="country1" name="country1" size="50" autocomplete="off" />
    
    <label for="country2">country 2 (datalist uses <code>&lt;option value="value" /&gt;</code>):</label>
    <input list="countrydata2" id="country2" name="country2" size="50" autocomplete="off" />
    
    <label for="country3">country 3 (datalist uses <code>&lt;option value="value"&gt;name&lt;/option&gt;</code>):</label>
    <input list="countrydata3" id="country3" name="country3" size="50" autocomplete="off" />
    
    <label for="country4">country 4 (datalist uses <code>&lt;option value="value" label="name" /&gt;</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>和文本输入字段均处于活动状态:

1.png

这两个值都可以在旧的IE中输入。您的应用程序必须:

  • 决定哪个最有效,或者

  • 使用小的JavaScript函数在另一个更改时重置一个

使用<datalist>非文本控件

基于Chrome的浏览器还可将<datalist>值应用于:

  1. 类型为的输入"date"。用户可以从定义为YYYY-MM-DD值但以其区域设置格式显示的一系列选项中进行选择。

  2. 类型为的输入"color"。用户可以从定义为六位十六进制值(三位数值无效)的颜色选项中进行选择。

  3. 类型为的输入"range"。滑块显示刻度线,尽管这并不限制可以输入哪个值。

<datalist> CSS样式

如果您在设计<select>包装盒时遇到困难,......就很简单!

一个<input>可以作为样式正常,但一个链接<datalist>和其子<option>元素不能在CSS定义样式。列表呈现完全由平台和浏览器确定。

我希望这种情况有所改善,但目前,MDN提出了一种解决方案,该解决方案是:

  1. 覆盖默认的浏览器行为

  2. 有效地对待<datalist>a,<div>因此可以在CSS中设置样式

  3. 复制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增强标准功能。例如:

  1. 实现可选验证,该验证仅接受中的已知值<datalist>

  2. <option>从Ajax调用返回的数据中设置元素以搜索API。

  3. 选择一个选项时,设置其他字段值。例如,选择"美国"会在隐藏的输入中设置"美国"。

<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}中,apiURL引用了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如何工作 {#howdatalistajaxworks}

如果您不想阅读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支持是一个遗憾,但是浏览器供应商最终可能会解决这种疏忽。

本教程中显示的任何代码和示例都可以用于您自己的项目。

赞(0)
未经允许不得转载:工具盒子 » HTML5数据列表:轻量级自动完成控件