日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

HTML5 給我們帶來了很多非常好的優(yōu)勢(shì)。除了統(tǒng)一錯(cuò)誤模型、引入新語義標(biāo)簽或簡(jiǎn)化文檔類型等常見問題之外,最大的改進(jìn)之一是表單的約束驗(yàn)證。如果沒有表單,網(wǎng)絡(luò)會(huì)是什么樣子?

約束驗(yàn)證試圖提高 Web 表單的可用性。瀏覽器可以直接告知用戶無效值的可能性,而不是將表單發(fā)送到服務(wù)器,然后將其評(píng)估為無效,返回到客戶端并最終由用戶進(jìn)行調(diào)整。這不僅減少了網(wǎng)絡(luò)通信,還提高了頁(yè)面的可用性。

需要注意的是,約束驗(yàn)證不能取代服務(wù)器端驗(yàn)證。此外,基于 JavaScript 的解決方案可能仍然有用。一般來說,我們總是必須實(shí)現(xiàn)服務(wù)器端驗(yàn)證。如果我們使用良好的架構(gòu),服務(wù)器上的模型約束將自動(dòng)反映在傳輸?shù)?HTML 代碼中。這樣我們就可以免費(fèi)獲得約束驗(yàn)證。現(xiàn)在我們可以使用 JavaScript 進(jìn)一步增強(qiáng)體驗(yàn),它既可以充當(dāng)約束驗(yàn)證的補(bǔ)充,也可以充當(dāng)填充。

我們將從非驗(yàn)證表單開始我們的旅程。然后我們將集成一個(gè)基于 JavaScript 的解決方案。最后介紹一下HTML5的約束驗(yàn)證。在最后一節(jié)中,我們將了解可能遇到的跨瀏覽器奇怪現(xiàn)象。

非驗(yàn)證表單提交

最經(jīng)典的 HTML 表單版本是不帶有任何客戶端驗(yàn)證邏輯的版本。我們只需要提供一個(gè)標(biāo)準(zhǔn)的形式,不需要任何特殊的屬性。正如簡(jiǎn)介中已經(jīng)指出的,我們需要始終特別注意這種表單提交。

盡管我們確實(shí)希望保護(hù)客戶端上已經(jīng)存在的表單,但我們永遠(yuǎn)無法確定所提交數(shù)據(jù)的狀態(tài)。保護(hù)和增強(qiáng)服務(wù)器上的表單驗(yàn)證的技術(shù)很大程度上取決于所使用的編程框架和語言。因此我們將跳過這樣的討論。相反,我們現(xiàn)在將討論一般的表單提交。

在《精通HTML5》系列的第二部分中我們已經(jīng)提到了表單編碼類型的重要性。我們還研究了三種成熟的編碼類型。剩下的問題是:這些價(jià)值觀實(shí)際上是如何建立的?瀏覽器的確切行為取決于為 action 指定的協(xié)議。為了簡(jiǎn)單起見,我們現(xiàn)在假設(shè) HTTP 或 HTTPS。

原則上,瀏覽器有兩個(gè)選項(xiàng):

    更改操作以攜帶表單的值。
    通過請(qǐng)求正文提交值。

兩者的程序大致相同。簡(jiǎn)而言之,我們發(fā)現(xiàn)以下步驟:

    使用正確的編碼構(gòu)建數(shù)據(jù)集。
    使用數(shù)據(jù)集和編碼類型創(chuàng)建請(qǐng)求。
    發(fā)送請(qǐng)求。

表單數(shù)據(jù)集的構(gòu)建意味著一些微妙的問題,但這些問題并不是很為人所知。例如,如果單擊按鈕來提交表單,情況就會(huì)有所不同。在這種情況下,按鈕的值將傳輸?shù)椒?wù)器。這可用于確定按下了哪個(gè)按鈕。


登錄后復(fù)制登錄后復(fù)制登錄后復(fù)制

如果我們按下第一個(gè)按鈕,那么以下內(nèi)容將被發(fā)送到服務(wù)器。

foo=bar

登錄后復(fù)制

從 JavaScript 觸發(fā)表單提交將導(dǎo)致不傳輸任何內(nèi)容。 JavaScript 代碼使用 HTMLFormElement 實(shí)例的 submit() 方法。

另一個(gè)有趣的方面是使用 image 類型提交輸入元素的單擊坐標(biāo)。 image 輸入類型不久前非常流行,人們認(rèn)為檢查用戶點(diǎn)擊的位置是個(gè)好主意。也許所顯示的圖像表明了幾種可能性。然后服務(wù)器將負(fù)責(zé)評(píng)估用戶的請(qǐng)求。

以下示例說明了此行為。


登錄后復(fù)制登錄后復(fù)制登錄后復(fù)制

如果我們點(diǎn)擊圖片提交表單,就會(huì)考慮foo的數(shù)據(jù)。僅當(dāng)值存在時(shí)才會(huì)插入名稱-值對(duì)。此外,我們需要命名輸入元素,否則不會(huì)傳輸任何內(nèi)容。

請(qǐng)求的內(nèi)容可能類似于以下代碼片段。

foo.x=71&foo.y=38&foo=bar

登錄后復(fù)制

此外,我們應(yīng)該注意不考慮禁用字段。這是有道理的。因此,下面的表格考慮了具有兩個(gè)輸入字段(一個(gè)啟用和一個(gè)禁用)的前兩個(gè)示例,可以構(gòu)建為概念證明。

以編程方式提交表單將導(dǎo)致傳輸單個(gè)值。

基本表單驗(yàn)證

即使沒有約束驗(yàn)證或 JavaScript,瀏覽器也已經(jīng)為我們提供了一些簡(jiǎn)單的表單驗(yàn)證。正如我們之前所看到的,表單的狀態(tài)(例如啟用或禁用)和提交者都會(huì)被考慮在內(nèi)。但是,這些都不會(huì)阻止表單的提交。一個(gè)簡(jiǎn)單的方法是編寫一些 JavaScript 來處理可能中止進(jìn)程的情況。

JavaScript 的最初用途之一實(shí)際上是為表單提供增強(qiáng)的功能。基本思想是在即將提交表單時(shí)收到事件通知。此時(shí)我們可以檢查所有值并中止該過程。當(dāng)然,我們可以改進(jìn)整個(gè)想法,以便在任何值發(fā)生變化時(shí)始終進(jìn)行檢查。盡管如此,最終我們可能會(huì)根據(jù)我們最后的評(píng)估而中止提交。

var form = document.querySelector('form');
form.addEventListener('submit', function (ev) {
	// always abort!
	ev.preventDefault();
}, false);

登錄后復(fù)制

理論上進(jìn)行實(shí)時(shí)驗(yàn)證很容易。然而,指定的 DOM 事件的工作方式可能與直觀猜測(cè)的不同。例如,文本框的 change 事件僅在文本框失去焦點(diǎn)后才會(huì)觸發(fā)。當(dāng)用戶單擊提交按鈕時(shí)可能會(huì)發(fā)生這種情況。因此,與驗(yàn)證的交互被破壞并且感覺不活躍。

相反,使用 keyupinput 事件是有意義的。雖然前者是文本框的有效解決方案,但后者適用于所有輸入元素(如預(yù)期)。唯一的限制是它是隨 HTML5 引入的,某些較舊的瀏覽器可能不支持。

考慮到這一點(diǎn),讓我們比較各個(gè)事件以查看執(zhí)行順序。下面的測(cè)試代碼可以幫助我們。

var input = document.querySelector('input');

['input', 'keyup', 'change'].forEach(function (eventName) {
	input.addEventListener(eventName, function (e) {
		console.log(eventName + ' event triggered');
	}, false);
});

登錄后復(fù)制

對(duì)于我們的測(cè)試 <input> 元素,當(dāng)使用幾個(gè)字母進(jìn)行探測(cè)時(shí),我們會(huì)看到以下結(jié)果。最后我們使用 Tab 鍵顯式地移開焦點(diǎn)。

正如我們所看到的,順序設(shè)置為首先觸發(fā) input 事件,然后觸發(fā) keyup。其實(shí)這是有道理的。首先我們需要 keydown,然后該值可能會(huì)發(fā)生變化,從而導(dǎo)致 input 事件。最后我們釋放密鑰,這會(huì)產(chǎn)生一個(gè) keyup 事件。值得強(qiáng)調(diào)的是,input 僅在值發(fā)生變化時(shí)才會(huì)觸發(fā),而 keyup 與實(shí)際值變化無關(guān)。舉個(gè)例子,如果我們按箭頭鍵,我們只會(huì)看到 keyup 事件,而看不到 input 事件。

可以通過向所有表單字段添加事件偵聽器來對(duì)所有元素進(jìn)行實(shí)時(shí)驗(yàn)證。或者,我們只需要為表單添加一個(gè)用于 input 事件的事件偵聽器。盡管非常優(yōu)雅,但這種方法有一個(gè)明顯的缺點(diǎn)。

考慮以下非常簡(jiǎn)單的 HTML:


登錄后復(fù)制登錄后復(fù)制登錄后復(fù)制

我們使用 HTML5 form 屬性在其外部聲明 <form> 的一個(gè)字段。但是,input 事件正常工作,因?yàn)檫@些事件實(shí)際上會(huì)在 DOM 樹中冒泡。因此,外部場(chǎng)觸發(fā)的特定事件將不會(huì)被看到。

因此,最可靠的方法是獲取表單并迭代 elements 集合中給出的子項(xiàng)。這里收集所有分配的字段(image 輸入類型除外)。

約束驗(yàn)證

約束驗(yàn)證意味著我們能夠在 HTML 源代碼中指定約束,然后瀏覽器使用這些約束來檢查表單。有很多可能性。很多選項(xiàng)與輸入類型相關(guān),不能隨意使用。在我們深入研究不同的驗(yàn)證和實(shí)現(xiàn)怪癖之前,讓我們先簡(jiǎn)要了解一下整體設(shè)計(jì)。

所選擇的 API 旨在使我們能夠進(jìn)行快速檢查。我們可以探測(cè)當(dāng)前實(shí)例是否能夠通過單個(gè) API 調(diào)用進(jìn)行約束驗(yàn)證。

API也非常開放,我們可以查詢?yōu)g覽器得到的結(jié)果,或者擴(kuò)展瀏覽器的結(jié)果。偽接口Validation也被其他接口繼承,不僅僅是HTMLInputElement

讓我們看一些示例代碼。在下面的代碼中,我們首先檢查表單驗(yàn)證是否可行。如果是這樣,那么我們關(guān)心 type=date 字段的驗(yàn)證結(jié)果。如果用戶選擇了有效日期,我們會(huì)檢查復(fù)選框的狀態(tài)。

var form = document.querySelector('form');
var date = document.querySelector('#birthday');

if (form.willValidate) {
	if (!date.validity.valid || checkbox.checked)
		checkbox.setCustomValidity('');
	else
		checkbox.setCustomValidity('You need to agree to our terms.');
}

登錄后復(fù)制

這樣的條件邏輯(僅在某些情況下有效)不能單獨(dú)使用標(biāo)記來實(shí)現(xiàn)。但我們可以很好地將自定義邏輯與集成功能結(jié)合起來。

HTML5 知道很多不同的輸入類型。但畢竟它們可以分為三類:

文字
數(shù)量
Date

value 屬性中看不到差異。這里我們總是得到 string 值。畢竟,該值將以文本形式提交。擁有這三個(gè)組的結(jié)果是針對(duì)某些類型的約束的不同行為。

以下約束幾乎總是以相同的方式起作用:

required,如果 value 的長(zhǎng)度為零,則導(dǎo)致 valueMissing

minlength,如果字符串長(zhǎng)度太短,會(huì)導(dǎo)致tooShort

maxlength,如果字符串長(zhǎng)度太長(zhǎng),會(huì)導(dǎo)致tooLong

當(dāng)然,也有例外情況。例如,復(fù)選框會(huì)對(duì) required 作出反應(yīng),要求進(jìn)行 checked。如果顏色選擇是 required 并且包含無效顏色,則顏色選擇將驗(yàn)證為 valueMissing。其他類型的反應(yīng)類似。

其他可能的約束取決于輸入的具體類型。類型決定了如何處理該值。是否將其視為文本?它代表一個(gè)數(shù)字嗎?約束對(duì)其做出反應(yīng)。

我們以date 輸入類型為例。如果設(shè)置了有效日期,如果限制為 required,我們會(huì)得到一個(gè) valueMissing。此外,如果實(shí)際輸入了某些內(nèi)容,則會(huì)設(shè)置 badInput。但是,如果日期有效,我們可能會(huì)出現(xiàn)以下一個(gè)或多個(gè)驗(yàn)證錯(cuò)誤:

rangeUnderflow,如果日期低于 min 屬性中指定的日期

rangeOverflow,如果日期高于 max 屬性中指定的日期

stepMismatch,如果日期不滿足提供的step 模式

最后一點(diǎn)相當(dāng)有趣。這里我們必須處理一種機(jī)制,該機(jī)制減去基數(shù)(可以是默認(rèn)基數(shù),也可以是 min 屬性中提供的)并計(jì)算可以對(duì)步驟取模的數(shù)字。對(duì)于日期輸入類型,計(jì)算并不完全明顯。實(shí)際提供的日期類型是不同的。然而,從用戶的角度來看,結(jié)果是有意義的。

對(duì)于文本輸入,還有 pattern 屬性,它允許我們指定用于驗(yàn)證的正則表達(dá)式。如果輸入類型支持此約束,則會(huì)在失敗時(shí)記錄 patternMismatch

結(jié)論

約束驗(yàn)證使我們能夠?yàn)橛脩簦词菇昧?JavaScript)提供有關(guān)當(dāng)前表單狀態(tài)的即時(shí)反饋。我們不必為了顯示錯(cuò)誤消息而浪費(fèi)往返服務(wù)器的網(wǎng)絡(luò)帶寬。盡管如此,我們應(yīng)該始終記住,表單提交通常是可以的。因此,在服務(wù)器端進(jìn)行一些驗(yàn)證是不可避免的。

約束驗(yàn)證帶來的可能性幾乎是無限的。我們可以使用客戶端驗(yàn)證來確保滿足正則表達(dá)式,考慮日期和數(shù)字的有效范圍,并選中某些復(fù)選框。我們還可以使用 JavaScript 擴(kuò)展可用的檢查。

參考文獻(xiàn)

MDN:約束驗(yàn)證
W3C:限制和表單提交
Raymond Camden:HTML5 表單驗(yàn)證 – 約束驗(yàn)證 API
Tomomi Imura – HTML5 輸入事件處理程序和用戶體驗(yàn)

TJ VanToll – 約束驗(yàn)證:Web 表單的本機(jī)客戶端驗(yàn)證

以上就是掌握HTML5:約束驗(yàn)證的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注www.92cms.cn其它相關(guān)文章!

分享到:
標(biāo)簽:HTML5 約束 驗(yàn)證
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定