做到這一點的最簡單方法是簡單地使用多個字段:
<div>
Phone:
(<input type="text" name="phone-1" maxlength="3">)
<input type="text" name="phone-2" maxlength="3">-
<input type="text" name="phone-3" maxlength="4">
</div>
<div>
SSN:
<input type="text" name="ssn-1">-
<input type="text" name="ssn-2">-
<input type="text" name="ssn-3">
</div>
雖然這種方法肯定是容易的,這是不是很大。用戶必須按標籤或點擊每個字段才能輸入數據,除了常識以外,什麼都不能阻止他們輸入數字以外的東西。
我總是覺得,驗證時,用戶的方式越少越好。讓他們以他們喜歡的任何格式輸入他們的電話號碼,然後擦洗它,除去數字以外的所有內容。這樣用戶可以輸入「5555551212」或「(555)555-1212」,但數據庫將始終保存「5555551212」。
要考慮的另一件事是,HTML5爲電話號碼提供了一些很好的特定類型(但不是SSN)。現代瀏覽器將負責所有輸入驗證,而且更好的是,移動設備將顯示數字鍵盤而不是整個鍵盤。
鑑於此,以顯示你的形式最好方式是這樣的:
<div>
<label for="fieldPhone">Phone: </label>
<input type="tel" id="fieldPhone" placeholder="(555) 555-1212">
</div>
<div>
<label for="fieldSsn">SSN: </label>
<input type="text" id="fieldSsn" name="ssn" placeholder="555-55-5555" pattern="\d{3}-?\d{2}-?\d{4}">
</div>
如果用戶擁有現代化的瀏覽器,這將處理輸入驗證的用戶側爲您服務。如果他們不這樣做,則必須使用驗證庫或polyfill。目前的HTML5表單驗證的整個列表polyfills這裏:
https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-Browser-Polyfills#wiki-web-forms
所以現在剩下的就是一定要規範你的數據,當您將它保存到數據庫中。
做這件事的理想場所是後端;但它並沒有說明你的表單將要發送到哪裏,所以你可能對後端的處理方式沒有任何發言權。所以你可以在前端做到這一點。例如,使用jQuery:
$('form').on('submit', function(){
$(this).find('input[type="tel"]').each(function(){
$(this).val() = $(this).val().replace(/[\s().+-]/g, '');
});
$(this).find('input[name="ssn"]').each(function(){
$(this).val() = $(this).val().replace(/-/g, '');
});
});
這是不是一個完美的方法之一:如果您在本功能做驗證,以及驗證失敗,用戶將看到他或她的輸入替換爲標準化版本,這可令人不安。
最好的方法是使用AJAX和.serialize
;您不僅可以更好地控制UI,還可以執行所需的所有驗證。但這可能超出了你現在需要做的一點。
請注意,手機驗證是最棘手的。 HTML5手機驗證非常寬鬆,允許用戶輸入國際電話號碼,這些號碼可能有相當複雜的格式。即使美國人有時也會輸入電話號碼,如「+1(555)555-1212」,然後你有8位數字而不是7位。如果你真的想限制他們到7位數字,你必須添加你的自定義的驗證:
/^\(?\d{3}\)?[.\s-]?\d{3}[.\s-]\d{4}$/
這將覆蓋到所有人羣使用(時間,空間,破折號,括號)的共同變化,仍然只允許7位美國的電話號碼。
這裏有一個的jsfiddle展示HTML5驗證和標準化:
http://jsfiddle.net/Cj7UG/1/
我希望這有助於!
在HTML5中,輸入元件可以具有['pattern'屬性,指定格式](HTTP:// www.whatwg.org/specs/web-apps/current-work/multipage/common-input-element-attributes.html#the-pattern-attribute)。另一方面,你永遠不應該信任客戶端驗證,因爲它很容易被繞過,你總是需要驗證服務器端的格式。 –
所以你想要兩個模式應該匹配'(XXX)XXX-XXXX'和'(XXX)XXX-XXXX'? –
蘇珊,這是正確的。將該行更改爲絕對沒有任何作用 – JefeTheTechy