搜尋
首頁web前端js教程使用JavaScript即時表單驗證

實時表單驗證:提升用戶體驗的微妙改進

Instant Form Validation Using JavaScript

核心要點:

  • JavaScript 可用於實現實時表單驗證,此功能可為用戶提供輸入有效性的即時反饋,從而提升用戶體驗並維護數據完整性,確保僅提交有效數據。
  • HTML5 屬性 patternrequired 可用於定義表單元素的有效輸入範圍。如果瀏覽器不支持這些屬性,則其值可用作 JavaScript 兼容性填充程序的基礎。
  • aria-invalid 屬性可用於指示字段是否無效。此屬性提供輔助功能信息,並可用作 CSS 鉤子以直觀地指示無效字段。
  • JavaScript 函數 instantValidation() 測試字段並執行實際驗證,控制 aria-invalid 屬性以指示字段的狀態。此函數可以綁定到 onchange 事件以提供實時表單驗證。

HTML5 引入了幾個用於實現基於瀏覽器的表單驗證的新屬性。 pattern 屬性是一個正則表達式,用於定義文本區域元素和大多數輸入類型的有效輸入範圍。 required 屬性指定字段是否必填。對於不支持這些屬性的舊版瀏覽器,我們可以使用它們的值作為兼容性填充程序的基礎。我們還可以使用它們來提供更有趣的增強功能——實時表單驗證。

需要注意的是,不要過度使用驗證,以免破壞正常的瀏覽行為並妨礙用戶操作。例如,我見過一些表單,無法使用 Tab 鍵離開無效字段——JavaScript 被用來(更確切地說,是被濫用)強制焦點停留在字段內,直到其有效為止。這非常不利於用戶體驗,並且直接違反了輔助功能指南。

本文將介紹一種侵入性較小的實現方法。它甚至不是完整的客戶端驗證——它只是一種細微的用戶體驗增強,以可訪問的方式實現,在我測試腳本時發現它幾乎與 Firefox 當前原生實現的功能相同!

基本概念

在最新版本的 Firefox 中,如果必填字段為空或其值與模式不匹配,則該字段將顯示紅色邊框,如下圖所示:

Instant Form Validation Using JavaScript

當然,這不會立即發生。如果發生這種情況,則每個必填字段默認都會顯示該邊框。相反,只有在您與字段交互後才會顯示這些邊框,這基本上(雖然不完全)類似於 onchange 事件。

因此,我們將使用 onchange 作為觸發事件。或者,我們可以使用 oninput 事件,該事件只要在字段中鍵入或粘貼任何值就會觸發。但這真的太“即時”了,因為它很容易在快速連續鍵入時反复觸發,從而產生閃爍效果,這會讓一些用戶感到厭煩或分心。而且,無論如何,oninput 不會從編程輸入中觸發,而 onchange 會觸發,我們可能需要它來處理來自第三方插件的自動完成等操作。

定義HTML和CSS

讓我們看一下我們的實現,從它所基於的 HTML 開始:

<form action="#" method="post">
  <fieldset>
    <legend><strong>Add your comment</strong></legend>

    <p>
      <label for="author">Name <abbr title="Required">*</abbr></label>
      <input
        aria-required="true"
        id="author"
        name="author"
        pattern="^([- \w\d\u00c0-\u024f]+)$"
        required="required"
        size="20"
        spellcheck="false"
        title="Your name (no special characters, diacritics are okay)"
        type="text"
        value=""
      >
    </p>

    <p>
      <label for="email">Email <abbr title="Required">*</abbr></label>
      <input
        aria-required="true"
        id="email"
        name="email"
        pattern="^(([-\w\d]+)(\.[-\w\d]+)*@([-\w\d]+)(\.[-\w\d]+)*(\.([a-zA-Z]{2,5}|[\d]{1,3})){1,2})$"
        required="required"
        size="30"
        spellcheck="false"
        title="Your email address"
        type="email"
        value=""
      >
    </p>

    <p>
      <label for="website">Website</label>
      <input
        id="website"
        name="website"
        pattern="^(http[s]?:\/\/)?([-\w\d]+)(\.[-\w\d]+)*(\.([a-zA-Z]{2,5}|[\d]{1,3})){1,2}(\/([-~%\.\(\)\w\d]*\/*)*(#[-\w\d]+)?)?$"
        size="30"
        spellcheck="false"
        title="Your website address"
        type="url"
        value=""
      >
    </p>

    <p>
      <label for="text">Comment <abbr title="Required">*</abbr></label>
      <textarea
        aria-required="true"
        cols="40"
        id="text"
        name="text"
        required="required"
        rows="10"
        spellcheck="true"
        title="Your comment"
      ></textarea>
    </p>

  </fieldset>
  <fieldset>
    <input name="preview" type="submit" value="Preview">
    <input name="save" type="submit" value="Submit Comment">
  </fieldset>
</form>

此示例是一個簡單的評論表單,其中一些字段是必填的,一些字段經過驗證,一些字段同時滿足這兩個條件。具有 required 屬性的字段也具有 aria-required 屬性,以便為不支持新輸入類型的輔助技術提供後備語義。

ARIA 規範還定義了 aria-invalid 屬性,我們將使用它來指示字段是否無效(HTML5 中沒有等效屬性)。 aria-invalid 屬性顯然提供了輔助功能信息,但它也可以用作 CSS 鉤子來應用紅色邊框:

input[aria-invalid="true"], textarea[aria-invalid="true"] {
  border: 1px solid #f00;
  box-shadow: 0 0 4px 0 #f00;
}

我們可以只使用 box-shadow 而不用管邊框,坦白說這樣看起來會更好,但這樣一來,在不支持 box-shadow 的瀏覽器(例如 IE8)中就沒有指示了。

添加JavaScript

現在我們有了靜態代碼,我們可以添加腳本了。首先,我們需要一個基本的 addEvent() 函數:

function addEvent(node, type, callback) {
  if (node.addEventListener) {
    node.addEventListener(type, function(e) {
      callback(e, e.target);
    }, false);
  } else if (node.attachEvent) {
    node.attachEvent('on' + type, function(e) {
      callback(e, e.srcElement);
    });
  }
}

接下來,我們需要一個函數來確定是否應該驗證給定字段,該函數只需測試它既未禁用也未只讀,並且它具有 patternrequired 屬性:

function shouldBeValidated(field) {
  return (
    !(field.getAttribute("readonly") || field.readonly) &&
    !(field.getAttribute("disabled") || field.disabled) &&
    (field.getAttribute("pattern") || field.getAttribute("required"))
  );
}

前兩個條件可能看起來很冗長,但它們是必要的,因為元素的 disabledreadonly 屬性不一定反映其屬性狀態。例如,在 Opera 中,具有硬編碼屬性 readonly="readonly" 的字段仍然會為其 readonly 屬性返回 undefined(點屬性只匹配通過腳本設置的狀態)。

一旦我們獲得了這些實用程序,我們就可以定義主驗證函數,該函數測試字段,然後根據需要執行實際驗證:

function instantValidation(field) {
  if (shouldBeValidated(field)) {
    var invalid =
      (field.getAttribute("required") && !field.value) ||
      (field.getAttribute("pattern") &&
        field.value &&
        !new RegExp(field.getAttribute("pattern")).test(field.value));
    if (!invalid && field.getAttribute("aria-invalid")) {
      field.removeAttribute("aria-invalid");
    } else if (invalid && !field.getAttribute("aria-invalid")) {
      field.setAttribute("aria-invalid", "true");
    }
  }
}

因此,如果字段是必填的但沒有值,或者它具有模式和值,但值與模式不匹配,則該字段無效。

由於模式已經定義了正則表達式的字符串形式,所以我們只需要將該字符串傳遞給 RegExp 構造函數,它就會創建一個我們可以針對該值進行測試的正則表達式對象。但是,我們必須預先測試該值以確保它不為空,這樣正則表達式本身就不必考慮空字符串。

一旦我們確定了字段是否無效,我們就可以控制它的aria-invalid 屬性來指示該狀態——將其添加到尚未具有該屬性的無效字段中,或將其從具有該屬性的有效字段中刪除。很簡單!最後,為了使這一切都能運行,我們需要將驗證函數綁定到 onchange 事件。它應該像這樣簡單:

<form action="#" method="post">
  <fieldset>
    <legend><strong>Add your comment</strong></legend>

    <p>
      <label for="author">Name <abbr title="Required">*</abbr></label>
      <input
        aria-required="true"
        id="author"
        name="author"
        pattern="^([- \w\d\u00c0-\u024f]+)$"
        required="required"
        size="20"
        spellcheck="false"
        title="Your name (no special characters, diacritics are okay)"
        type="text"
        value=""
      >
    </p>

    <p>
      <label for="email">Email <abbr title="Required">*</abbr></label>
      <input
        aria-required="true"
        id="email"
        name="email"
        pattern="^(([-\w\d]+)(\.[-\w\d]+)*@([-\w\d]+)(\.[-\w\d]+)*(\.([a-zA-Z]{2,5}|[\d]{1,3})){1,2})$"
        required="required"
        size="30"
        spellcheck="false"
        title="Your email address"
        type="email"
        value=""
      >
    </p>

    <p>
      <label for="website">Website</label>
      <input
        id="website"
        name="website"
        pattern="^(http[s]?:\/\/)?([-\w\d]+)(\.[-\w\d]+)*(\.([a-zA-Z]{2,5}|[\d]{1,3})){1,2}(\/([-~%\.\(\)\w\d]*\/*)*(#[-\w\d]+)?)?$"
        size="30"
        spellcheck="false"
        title="Your website address"
        type="url"
        value=""
      >
    </p>

    <p>
      <label for="text">Comment <abbr title="Required">*</abbr></label>
      <textarea
        aria-required="true"
        cols="40"
        id="text"
        name="text"
        required="required"
        rows="10"
        spellcheck="true"
        title="Your comment"
      ></textarea>
    </p>

  </fieldset>
  <fieldset>
    <input name="preview" type="submit" value="Preview">
    <input name="save" type="submit" value="Submit Comment">
  </fieldset>
</form>

但是,為了使這能夠工作,onchange 事件必須冒泡(使用通常稱為事件委託的技術),但在Internet Explorer 8 及更早版本中,onchange 事件不會冒泡。我們可以選擇忽略這些瀏覽器,但我認為這將是一種遺憾,尤其是在問題如此容易解決的情況下。它只是意味著代碼更複雜一些——我們必須獲取輸入和文本區域元素的集合,遍歷它們並將 onchange 事件分別綁定到每個字段:

input[aria-invalid="true"], textarea[aria-invalid="true"] {
  border: 1px solid #f00;
  box-shadow: 0 0 4px 0 #f00;
}

結論和展望

就是這樣——一個簡單且非侵入性的實時表單驗證增強功能,提供可訪問和直觀的提示,以幫助用戶完成表單。

這個腳本實現後,我們實際上只需要幾步就能完成一個完整的兼容性填充程序。這樣的腳本超出了本文的範圍,但是如果您想進一步開發它,所有基本模塊都在這裡——測試是否應該驗證字段,根據模式和/或 required 驗證字段,以及綁定觸發事件。

我必須承認,我不確定它是否真的值得!如果您已經有了此增強功能(在IE7 及所有現代瀏覽器中都能工作),並且考慮到您別無選擇,也必須實現服務器端驗證,並且考慮到支持patternrequired 的瀏覽器已經使用它們進行預提交驗證——考慮到所有這些,真的還有必要添加另一個兼容性填充程序嗎?

(此處可以添加關於實時驗證的常見問題解答部分,內容與原文檔中的FAQs部分相同)

以上是使用JavaScript即時表單驗證的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
在JavaScript中替換字符串字符在JavaScript中替換字符串字符Mar 11, 2025 am 12:07 AM

JavaScript字符串替換方法詳解及常見問題解答 本文將探討兩種在JavaScript中替換字符串字符的方法:在JavaScript代碼內部替換和在網頁HTML內部替換。 在JavaScript代碼內部替換字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 該方法僅替換第一個匹配項。要替換所有匹配項,需使用正則表達式並添加全局標誌g: str = str.replace(/fi

構建您自己的Ajax Web應用程序構建您自己的Ajax Web應用程序Mar 09, 2025 am 12:11 AM

因此,在這裡,您準備好了解所有稱為Ajax的東西。但是,到底是什麼? AJAX一詞是指用於創建動態,交互式Web內容的一系列寬鬆的技術。 Ajax一詞,最初由Jesse J創造

10個JQuery Fun and Games插件10個JQuery Fun and Games插件Mar 08, 2025 am 12:42 AM

10款趣味橫生的jQuery遊戲插件,讓您的網站更具吸引力,提升用戶粘性!雖然Flash仍然是開發休閒網頁遊戲的最佳軟件,但jQuery也能創造出令人驚喜的效果,雖然無法與純動作Flash遊戲媲美,但在某些情況下,您也能在瀏覽器中獲得意想不到的樂趣。 jQuery井字棋遊戲 遊戲編程的“Hello world”,現在有了jQuery版本。 源碼 jQuery瘋狂填詞遊戲 這是一個填空遊戲,由於不知道單詞的上下文,可能會產生一些古怪的結果。 源碼 jQuery掃雷遊戲

如何創建和發布自己的JavaScript庫?如何創建和發布自己的JavaScript庫?Mar 18, 2025 pm 03:12 PM

文章討論了創建,發布和維護JavaScript庫,專注於計劃,開發,測試,文檔和促銷策略。

jQuery視差教程 - 動畫標題背景jQuery視差教程 - 動畫標題背景Mar 08, 2025 am 12:39 AM

本教程演示瞭如何使用jQuery創建迷人的視差背景效果。 我們將構建一個帶有分層圖像的標題橫幅,從而創造出令人驚嘆的視覺深度。 更新的插件可與JQuery 1.6.4及更高版本一起使用。 下載

如何在瀏覽器中優化JavaScript代碼以進行性能?如何在瀏覽器中優化JavaScript代碼以進行性能?Mar 18, 2025 pm 03:14 PM

本文討論了在瀏覽器中優化JavaScript性能的策略,重點是減少執行時間並最大程度地減少對頁面負載速度的影響。

使用jQuery和Ajax自動刷新DIV內容使用jQuery和Ajax自動刷新DIV內容Mar 08, 2025 am 12:58 AM

本文演示瞭如何使用jQuery和ajax自動每5秒自動刷新DIV的內容。 該示例從RSS提要中獲取並顯示了最新的博客文章以及最後的刷新時間戳。 加載圖像是選擇

Matter.js入門:簡介Matter.js入門:簡介Mar 08, 2025 am 12:53 AM

Matter.js是一個用JavaScript編寫的2D剛體物理引擎。此庫可以幫助您輕鬆地在瀏覽器中模擬2D物理。它提供了許多功能,例如創建剛體並為其分配質量、面積或密度等物理屬性的能力。您還可以模擬不同類型的碰撞和力,例如重力摩擦力。 Matter.js支持所有主流瀏覽器。此外,它也適用於移動設備,因為它可以檢測觸摸並具有響應能力。所有這些功能都使其值得您投入時間學習如何使用該引擎,因為這樣您就可以輕鬆創建基於物理的2D遊戲或模擬。在本教程中,我將介紹此庫的基礎知識,包括其安裝和用法,並提供一

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
2 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)