Tôi có thể đánh dấu trường không hợp lệ từ javascript không?


93

Từ việc đọc bài đăng này, tôi nhận thấy rằng có một số lớp giả cho các giá trị đầu vào 'hợp lệ' và 'không hợp lệ' được đưa vào HTML5.

Có cách nào để tôi có thể đánh dấu trường nhập là không hợp lệ / hợp lệ từ javascript không? Hoặc cách khác, tôi có thể ghi đè phương thức xác thực đã sử dụng không?


Bạn luôn có thể nhân đôi với một lớp "không hợp lệ", nhưng sẽ thực sự thú vị khi biết rằng có một cách tốt hơn.
Pointy

1
Vâng, tất nhiên, nhưng điều đó sẽ nhàm chán;)
Svish

1
Svish, bạn có thể đánh giá lại các câu trả lời dưới đây? Có vẻ như dajavax đã cung cấp một câu trả lời đúng như những gì bạn muốn. Nó có thể hữu ích cho những khách truy cập khác nếu bạn đánh dấu câu trả lời của dajavax là câu trả lời được chấp nhận.
Kodos Johnson

@KodosJohnson Chắc chắn, cảm ơn vì sự quan tâm của bạn 🙂
Svish

Câu trả lời:


160

Bạn có thể sử dụng hàm customValidity cho mục đích này.

Nếu bạn thêm thông báo customValidity vào trường, thông báo đó sẽ trở nên không hợp lệ. Khi bạn đặt thư là một chuỗi trống, thư sẽ hợp lệ trở lại (trừ khi không hợp lệ vì lý do khác).

field.setCustomValidity("Invalid field."); sẽ làm cho trường không hợp lệ.

field.setCustomValidity(""); sẽ làm cho trường hợp lệ trừ khi nó không thành công với ràng buộc HTML5.


1
Tuyệt vời. Cảm ơn bạn. Đã thêm vào codepen.io/kevinSuttle/post/the-current-state-of-web-forms
Kevin Suttle

4
Ngoài ra, nếu bạn muốn thông báo hợp lệ của trình duyệt hiển thị trên inputhoặc blurbạn có thể sử dụng field.reportValidity () ngay sau đó.
Sam Carlton

4

Chỉnh sửa : Ai đó đã làm rõ rằng bạn đang tìm kiếm các thuộc tính "hợp lệ" "không hợp lệ" cho DOM.

Tôi sẽ thêm các thuộc tính vào mỗi thẻ bằng cách sử dụng dom_object.setAttribute("isvalid", "true"). Bạn cũng có thể có một chức năng xác thực trung tâm cập nhật các thuộc tính này mỗi lần (và sử dụng dom_object.getAttribute("isvalid")mỗi lần).

Bạn có thể chạy chức năng này mỗi khi một phần tử mất tiêu điểm hoặc bất cứ khi nào bạn muốn.

Không hẳn là thanh lịch, nhưng tiếc là bây giờ không có hỗ trợ "giả" với javascript và HTML5.


Nếu tôi hiểu câu hỏi của bạn, bạn có thể xác thực bằng Javascript. Tuy nhiên, hãy lưu ý rằng rất dễ dàng để phá vỡ xác thực phía máy khách, đặc biệt là xác thực javascript . Bạn không bao giờ nên tin tưởng vào dữ liệu máy khách và luôn kiểm tra phía máy chủ.

Ví dụ: tôi có thể dễ dàng tìm thấy các ID phần tử bằng cách kiểm tra mã nguồn, sau đó thực hiện document.getElementById('some_id').setAttribute('max', new_number)để thay đổi giá trị tối đa (đây là một trong những mục nhập từ liên kết của bạn).

Có nhiều cách khác nhau để làm điều đó, vì vậy tôi sẽ cố gắng cung cấp cho bạn thành ngữ chung.

Bạn có thể lấy giá trị bằng cách thực hiện document.getElementById('form_element_id').value(đảm bảo rằng bạn cung cấp biểu mẫu a nameđược gửi đến máy chủ và biểu mẫu idđược sử dụng bởi javascript). Đối với textareas, bạn có thể sử dụng .innerHTML.

Sau đó, bạn có giá trị trong một biến, có nhiều cách khác nhau để kiểm tra nó.

Ví dụ, bạn có thể làm if (parseInt(my_value) < 0) //error. Bạn cũng có thể sử dụng biểu thức chính quy, tôi sẽ không giải thích tất cả nhưng bạn có thể bắt đầu tại đây http://www.w3schools.com/jsref/jsref_obj_regexp.asp . Tôi biết w3schools không phải là nguồn tốt nhất nhưng tôi thấy nó là một nơi bắt đầu ổn.

Bây giờ đến phần xác thực: hãy thêm onsubmit="return validateForm()vào thẻ biểu mẫu của bạn nơi validateForm () là hàm thực hiện tất cả việc kiểm tra. Và hàm chỉ trả về truenếu hợp lệ và falsengược lại. Điều này sẽ ghi đè chức năng xác thực mặc định (theo mặc định không làm gì cả).

Vì vậy, trong ví dụ trên, //errorsẽ được thay thế bằng return false. Bạn cũng có thể làm những việc khác; chẳng hạn như cảnh báo lỗi sau đó trả về false. Bạn cũng có thể sử dụng javascript để đánh dấu các trường không hợp lệ (không chắc đây có phải là ý của bạn hay không khi " đánh dấu trường nhập là không hợp lệ / hợp lệ từ javascript ")

Tất nhiên, nếu bạn không muốn kiểm tra tất cả các trường, bạn chỉ phải trả về true nếu các trường nhất định vượt qua. Một lần nữa, bạn không nên dựa vào điều này, nhưng nếu bạn chỉ muốn ngăn cản những người bình thường thì đó là một giải pháp dễ dàng.


8
Bạn hoàn toàn chính xác, nhưng tôi không nghĩ bạn đã hiểu câu hỏi hoàn toàn. Trong HTML5, có nhiều cách khác nhau để thêm các giá trị thuộc tính vào đánh dấu HTML ngụ ý các quy tắc xác thực tích hợp sẵn. Khi trình duyệt áp dụng các quy tắc đó, trường đầu vào sẽ khớp với các lớp giả ": valid" hoặc ": invalid" trong CSS. Do đó, bạn có thể viết HTML với các thuộc tính đó và CSS với các bộ chọn ": valid" và ": valid" với các quy tắc và đưa ra phản hồi trực quan mà không cần bất kỳ JavaScript nào. Câu hỏi đặt ra là về cơ bản, trạng thái ": valid" có sẵn dưới dạng thuộc tính DOM hay không.
Pointy

-17

Có cách nào để tôi có thể đánh dấu trường nhập là không hợp lệ / hợp lệ từ javascript không?

Thật không may, bạn không thể định kiểu các lớp giả trong JavaScript, vì chúng không phải là phần tử thực, chúng không tồn tại trong DOM thực.

Với JavaScript vani, bạn sẽ sử dụng API xác thực .

Trong jQuery, bạn có thể thực hiện việc này một cách đơn giản, http://jsfiddle.net/elclanrs/Kak6S/

if ( $input.is(':invalid') ) { ... }

Hoặc cách khác, tôi có thể ghi đè phương thức xác thực đã sử dụng không?

Nếu bạn đang sử dụng xác thực HTML5, hãy theo dõi phần đánh dấu. Nếu không, bạn có thể tắt xác thực HTML5 $form.attr('novalidate', 'novalidate')và sử dụng JS để xác thực các trường của mình, sau đó thêm validhoặc invalidcác lớp nếu cần. Tôi đã tạo một plugin hoạt động như thế này để hỗ trợ các trình duyệt không phải HTML5.


Ý bạn là gì bạn không thể tạo kiểu cho chúng? Tôi đã làm điều đó. input:invalid + label::after{content: " INVALID";color: red;}Thêm một đoạn văn bản INVALID màu đỏ sau nhãn mà tôi có bên cạnh trường nhập liệu nếu trường không hợp lệ (ví dụ: nếu trường email có email không hợp lệ)
Svish

11
"Có cách nào để tôi có thể đánh dấu trường nhập là không hợp lệ / hợp lệ từ javascript không?" "Thật không may, bạn không thể định kiểu các lớp giả từ JavaScript" Đó không phải là câu hỏi được đặt ra.
mikemaccana

Bạn sẽ có thể sử dụng CSSOM định nghĩa một lớp mới với một pseudo-class động mặc dù ...
Brett Zamir
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.