新聞中心
在Web設(shè)計中,經(jīng)常會用到如輸入框的自動下拉提示,這將大大方便用戶的輸入。比如在Google中進(jìn)行搜索的時候,就會出現(xiàn)下拉的智能提示列表選擇框。這樣的下拉列表框稱為AutoComplete。在以前,如果要實(shí)現(xiàn)這樣的功能,必須要求開發(fā)者使用一些Javascript的技巧或相關(guān)的框架進(jìn)行ajax調(diào)用,需要一定的編程工作量。但隨著HTML 5 的慢慢普及,開發(fā)者可以使用其中的新的DataList標(biāo)記就能快速開發(fā)出十分漂亮的 AutoComplete組件的效果。本文將以實(shí)例的方式講解HTML 5中DataList的使用和要注意的事項。

成都創(chuàng)新互聯(lián)公司,為您提供成都網(wǎng)站建設(shè)公司、成都網(wǎng)站制作、網(wǎng)站營銷推廣、網(wǎng)站開發(fā)設(shè)計,對服務(wù)混凝土泵車等多個行業(yè)擁有豐富的網(wǎng)站建設(shè)及推廣經(jīng)驗(yàn)。成都創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)公司成立于2013年,提供專業(yè)網(wǎng)站制作報價服務(wù),我們深知市場的競爭激烈,認(rèn)真對待每位客戶,為客戶提供賞心悅目的作品。 與客戶共同發(fā)展進(jìn)步,是我們永遠(yuǎn)的責(zé)任!
創(chuàng)建DataList
首先,我們看下傳統(tǒng)的簡單文本輸入框是什么樣子的,如下代碼所示:
這個輸入框中,用戶必須手動在其中輸入文字內(nèi)容,并沒有提示,而如果使用了HTML5 中的DataList,則可以允許用戶從下拉列表中選擇。一個最簡單的DataList使用如下方式聲明:
在
在上面的代碼中,為文本輸入框inputbox指定list屬性,其值一定要和
在上圖中,左上角的圖為IE 10中的效果,右上角圖為Firefox 18中的效果,左下角圖為Chrome 24中的效果,右下角圖為Opera 12的效果。
要注意的是IE 10和Opera 中,不需要用戶必須輸入一個字符才看到下拉的建議列表,而其他瀏覽器需要用戶至少輸入一個字符才能看到效果。
在Datlist中,同樣可以為每一個下拉列表選項指定一個value值,如下代碼:
- label for="state">State:
如果在option中一旦指定了value的值,則用戶通過下拉列表選擇后,文本框中顯示的將會是value的值,如下圖:
Autocomplete屬性
下面講解autocomplete屬性。該屬性可以設(shè)置為on或off,表示輸入字段是否應(yīng)該啟用自動完成功能,如下代碼所示:
要注意的是,在opera瀏覽器中,如果設(shè)置autocomplete為off,則根本不顯示datalist,而在其他瀏覽器中,是會顯示datalist的,只不過失去自動建議提醒功能。
其他輸入的屬性
接下來,我們學(xué)習(xí)下datalist中其他的輸入屬性。在datalist的下拉列表提示框中,還可以支持其他類型的HTML 5標(biāo)簽,比如下面的代碼,展示的是一個HTML 5的滑動數(shù)字條,在運(yùn)行后,當(dāng)鼠標(biāo)每向右滑動時,會有對應(yīng)的文字提示:
- label for="donation">Donation Amount (USD):
- step="5" min="5" max="200">
#p#
下圖是分別在Chrome 24和IE 10的效果圖:
可惜的是,目前只有Chrome和IE 10支持datalist中使用range范圍控件的做法。下面的這個表,很清晰說明了在各個瀏覽器中datalist和其他HTML 5控件搭配的情況:
什么時候該使用DataList?
要注意的是,使用這種下拉的智能提示框也要注意場合。比如在一些要選擇不是太多的場景下,使用一般的下拉框其實(shí)就可以了。而如果在需要用戶在很多數(shù)據(jù)中去選擇,則可以建議使用Datalist下拉建議提示框,因?yàn)榭梢苑奖阌脩艨焖贆z索去選擇。一個典型的場景就是對世界各個國家的選擇,如下代碼:
限制datalist選擇的值
有的場景下,我們要限制用戶在下拉自動提示列表中所選擇的值,而在IE 10中,有一系列專門為此新加入的API,具體可以參考:
http://msdn.microsoft.com/en-us/library/ie/hh673544(v=vs.85).aspx#dom_methods_input_val,下面的代碼是一個使用的例子:
- / 找出所有綁定了datalist的input文本框
- var inputs = document.querySelectorAll('input[list]');
- for (var i = 0; i < inputs.length; i++) {
- //當(dāng)輸入文本框的值發(fā)生改變
- inputs[i].addEventListener('change', function() {
- var optionFound = false,
- datalist = this.list;
- //判斷用戶的輸入是否存在于datalist的下拉列表框的數(shù)據(jù)項中
- for (var j = 0; j < datalist.options.length; j++) {
- if (this.value == datalist.options[j].value) {
- optionFound = true;
- break;
- }
- }
- 使用IE 10的Validation API中的setCustomValidity方法對是否存在合法的輸入值進(jìn)行前端的響應(yīng)展示
- if (optionFound) {
- this.setCustomValidity('');
- } else {
- //如果用戶的輸入不在datalist列表中,前端顯示相關(guān)錯誤信息
- this.setCustomValidity('Please select a valid value.');
- }
- });
- }
下圖是在IE 10下,當(dāng)用戶輸入的值不在下拉列表后,瀏覽器顯示的錯誤提示信息如下:
要注意的是,客戶端的這種驗(yàn)證不能取代服務(wù)端的驗(yàn)證,***的做法是依然在服務(wù)端進(jìn)行合法性的校驗(yàn)。而且要注意的是在舊的瀏覽器中,是缺乏這種對于datalist的校驗(yàn)支持的,除非開發(fā)者另外進(jìn)行編碼進(jìn)行校驗(yàn)。
如何應(yīng)對不支持的瀏覽器
在寫本文的時候,依然只有IE 10,Firefox 4+,Chrome 20+和Opera是支持datalist的,這意味著不少舊版本的瀏覽器的用戶不能使用datalist的功能,但辦法總是有的,下面分別介紹一些折衷的辦法
1)datalist中嵌套使用傳統(tǒng)的select下拉選擇框
一個不錯的解決方法,是在提供傳統(tǒng)的select下拉文本框的同時,提供給用戶能輸入普通文本的文本框,如下代碼:
- If other, please specify:
#p#
運(yùn)行的效果為如下圖所示:
在寫本文的時候,依然只有IE 10,Firefox 4+,Chrome 20+和Opera是支持datalist的,這意味著不少舊版本的瀏覽器的用戶不能使用datalist的功能,但辦法總是有的,下面分別介紹一些折衷的辦法:
1)datalist中嵌套使用傳統(tǒng)的select下拉選擇框
一個不錯的解決方法,是在提供傳統(tǒng)的select下拉文本框的同時,提供給用戶能輸入普通文本的文本框,如下代碼:
- If other, please specify:
運(yùn)行的效果為如下圖所示:
意在上面的代碼中,在datalist中嵌套了傳統(tǒng)的select下拉文本框,而input文本框中依然綁定了datalist,這樣的好處是,當(dāng)在不支持datalist的瀏覽器中運(yùn)行的時候會有上圖的效果:一邊是下拉選擇,另外的是可以允許用戶輸入下拉列表中不存在的記錄。而上面的代碼如果在支持datalist的瀏覽器中運(yùn)行,則是原來的只顯示一個datalist的效果。
2)使用jquery ui中的autocomplete插件
還有一種方法就是判斷當(dāng)用戶的瀏覽器是不支持datalist的話,則使用jquery ui中的autocomplete插件,代碼如下:
- if (Modernizr.input.list) {
- //如果返回值為true,則證明瀏覽器支持datalist
- } else {
- //瀏覽器不支持datalist
- }
- }
使用jquery ui中的autocomplete插件的原因之一是因?yàn)槠涔δ軓?qiáng)大和簡單易用,當(dāng)然讀者可以從下面的這個地址獲得更多的候選方案:https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-Browser-Polyfills,里面提供了很多在其他瀏覽器中用其他方法實(shí)現(xiàn)同樣的HTML 5功能的方法。下面是具體的代碼:
- var datalist,
- listAttribute,
- options = [];
- if (!Modernizr.input.list) {
- // 對每一個綁定datalist的輸入文本框循環(huán)遍歷
- $('input[type="text"][list]').each(function() {
- //找出對應(yīng)的datalist
- listAttribute = $(this).attr('list');
- datalist = $('#' + listAttribute);
- if (datalist.length > 0) {
- options = [];
- //將datalist中的option值復(fù)制到j(luò)query autocomplete控件中去
- datalist.find('option').each(function() {
- options.push({ label: this.innerHTML, value: this.value });
- });
- //將options和autocomplete控件重新綁定
- $(this).autocomplete({ source: options });
- }
- });
- // 移除所有的datalist不予以顯示
- $('datalist').remove();
- }
上面代碼的核心,就是找出所有的datalist中的值,然后循環(huán)逐一復(fù)制到傳統(tǒng)的options數(shù)組中,然后將options和autocomplete控件重新綁定,,并不顯示datalist,這樣上面的代碼就既可以在支持datalist的瀏覽器中運(yùn)行,也可以在不支持datalist的瀏覽器中運(yùn)行。
下圖是在Safari瀏覽器中運(yùn)行的效果圖:
在上面的圖中,可以看到,jquery autocomplete默認(rèn)是下拉列出和用戶輸入字符匹配的所有單詞,而原生的datalist只是列出首字母相同的單詞。因此如果需要改動的話,可以按如下代碼的方式,則可以讓jquery autocomplete達(dá)到相同的效果。
要注意的是,針對舊版本的IE 瀏覽器(IE 9及之前的)必須要求options標(biāo)簽是一定要位于select標(biāo)簽的子標(biāo)簽中,這個可以通過使用如下代碼的
條件注釋去解決這個問題(參考:http://msdn.microsoft.com/library/ms537512.aspx)
這樣,IE 9及以前的IE 瀏覽器則不會對以上的語法報錯了。
Datalist的限制
當(dāng)然,Datalist也有限制和不足之處,體現(xiàn)在:
1)不能使用CSS去隨意控制或改變其下拉建議列表中的項
2)不能控制datalist的位置
3) 不能控制每次當(dāng)用戶輸入多少個字符后,就出現(xiàn)下拉建議列表
4)不能控制大小寫敏感,或當(dāng)匹配什么樣的字符就出現(xiàn)下拉建議列表
5)不能將其與服務(wù)端的數(shù)據(jù)源綁定
因此,目前來說,除非HTM L5關(guān)于datalist的相關(guān)標(biāo)準(zhǔn)有繼續(xù)修訂,或者各大瀏覽器廠商繼續(xù)去改進(jìn),否則建議在實(shí)際的應(yīng)用中,依然使用如jQuery Autocomplete等類似的插件去實(shí)現(xiàn)該功能。
分享題目:HTML5DataList入門教程
標(biāo)題URL:http://www.dlmjj.cn/article/djohodg.html


咨詢
建站咨詢
