Đối với tiền tệ, tôi muốn đề xuất:
<div><label>Amount $
<input type="number" placeholder="0.00" required name="price" min="0" value="0" step="0.01" title="Currency" pattern="^\d+(?:\.\d{1,2})?$" onblur="
this.parentNode.parentNode.style.backgroundColor=/^\d+(?:\.\d{1,2})?$/.test(this.value)?'inherit':'red'
"></label></div>
Xem http://jsfiddle.net/vx3axsk5/1/
Các thuộc tính HTML5 "bước", "min" và "mẫu" sẽ được xác thực khi biểu mẫu được gửi, không phải onblur. Bạn không cần step
nếu bạn có pattern
và bạn không cần pattern
nếu bạn có step
. Vì vậy, bạn có thể trở lại step="any"
với mã của tôi vì mẫu sẽ xác nhận nó bằng mọi cách.
Nếu bạn muốn xác thực onblur, tôi tin rằng việc cung cấp cho người dùng một dấu hiệu trực quan cũng hữu ích như tô màu nền đỏ. Nếu trình duyệt của người dùng không hỗ trợ, type="number"
nó sẽ dự phòng type="text"
. Nếu trình duyệt của người dùng không hỗ trợ xác thực mẫu HTML5, đoạn mã JavaScript của tôi sẽ không ngăn biểu mẫu gửi, nhưng nó đưa ra một dấu hiệu trực quan. Vì vậy, đối với những người có hỗ trợ HTML5 kém và những người đang cố gắng xâm nhập vào cơ sở dữ liệu bằng JavaScript bị vô hiệu hóa hoặc giả mạo các Yêu cầu HTTP, bạn cần phải xác thực lại trên máy chủ bằng mọi cách. Điểm có xác nhận ở mặt trước là cho trải nghiệm người dùng tốt hơn. Vì vậy, miễn là hầu hết người dùng của bạn có trải nghiệm tốt, thật tốt khi dựa vào các tính năng HTML5 với điều kiện mã sẽ vẫn hoạt động và bạn có thể xác thực ở mặt sau.