Thuộc tính yêu cầu dạng HTML5. Đặt thông báo xác thực tùy chỉnh?


326

Tôi đã có mẫu HTML5 sau: http://jsfiddle.net/nfgfP/

<form id="form" onsubmit="return(login())">
<input name="username" placeholder="Username" required />
<input name="pass"  type="password" placeholder="Password" required/>
<br/>Remember me: <input type="checkbox" name="remember" value="true" /><br/>
<input type="submit" name="submit" value="Log In"/>

Hiện tại khi tôi nhấn enter khi cả hai đều trống, một hộp bật lên xuất hiện với nội dung "Vui lòng điền vào trường này". Làm cách nào để thay đổi tin nhắn mặc định đó thành "Trường này không thể để trống"?

EDIT: Cũng lưu ý rằng thông báo lỗi của trường mật khẩu chỉ đơn giản là *****. Để tạo lại điều này, cung cấp cho tên người dùng một giá trị và nhấn gửi.

EDIT : Tôi đang sử dụng Chrome 10 để thử nghiệm. Hãy làm như vậy


1
Ồ, +1 cho thông báo xác thực mật khẩu trống điên rồ = / Làm thế nào mà nó vượt qua QA, tôi tự hỏi ...
David nói phục hồi Monica

3
Tại sao không chỉ chấp nhận thông báo mặc định của trình duyệt? Đó là những gì người dùng nhìn thấy cho mọi trang web khác họ truy cập, bạn sẽ chỉ gây nhầm lẫn cho người dùng của mình bằng cách tạo một thông báo không chuẩn. (Google có thể đã quản lý nhiều đánh giá và thử nghiệm UX hơn trong việc xác định từ ngữ đó hơn bạn có!).
ChrisV

12
@ChrisV Còn các trang web đa ngôn ngữ thì sao?
inemanja

1
Trong trường hợp của tôi, tôi muốn kiểm tra xem giá trị có phải là số trước khi đăng không nhưng tôi không thể sử dụng thuộc tính type = "number" (vì lý do.) Vì vậy, tôi đặt thuộc tính mẫu để kiểm tra số và số thập phân tùy chọn cung cấp thông báo , "Vui lòng khớp định dạng được yêu cầu", do lỗi. Tôi muốn nói rằng, "Các bạn phải tặng chúng tôi một số bucko."
Kristopher

Câu trả lời:


267

Sử dụng setCustomValidity:

document.addEventListener("DOMContentLoaded", function() {
    var elements = document.getElementsByTagName("INPUT");
    for (var i = 0; i < elements.length; i++) {
        elements[i].oninvalid = function(e) {
            e.target.setCustomValidity("");
            if (!e.target.validity.valid) {
                e.target.setCustomValidity("This field cannot be left blank");
            }
        };
        elements[i].oninput = function(e) {
            e.target.setCustomValidity("");
        };
    }
})

Tôi đã đổi thành JavaScript vanilla từ Mootools theo đề xuất của @itpastorn trong các nhận xét, nhưng bạn sẽ có thể tìm ra Mootools tương đương nếu cần.

Biên tập

Tôi đã cập nhật mã ở đây vì setCustomValidityhoạt động hơi khác với những gì tôi hiểu khi tôi trả lời ban đầu. Nếu setCustomValidityđược đặt thành bất kỳ thứ gì ngoài chuỗi trống, nó sẽ khiến trường được coi là không hợp lệ; do đó bạn phải xóa nó trước khi kiểm tra tính hợp lệ, bạn không thể chỉ đặt nó và quên.

Chỉnh sửa thêm

Như được chỉ ra trong bình luận của @ thomasvdb bên dưới, bạn cần phải xóa tính hợp lệ tùy chỉnh trong một số sự kiện bên ngoài invalidnếu không có thể có thêm thông qua oninvalidtrình xử lý để xóa nó.


Tôi đã thử điều này nhưng vẫn có một lỗi. Nếu bạn để trống trường, nó sẽ hiển thị thông báo, sau đó nhập nội dung nào đó vào trường nhưng hiện tại nó hiển thị một thông báo trống và hành động không được thực thi. Nếu bạn bây giờ bấm vào nút một lần nữa, nó sẽ đi qua.
thomasvdb

1
@thomasvdb Hãy thử đặt tính hợp lệ tùy chỉnh thành một chuỗi trống trong inputsự kiện. Tại thời điểm này, nó chỉ được xóa nếu invalidsự kiện bị sa thải.
robertc

Đây thực sự là giải pháp. Tìm thấy nó với giải pháp của @hleinone. Cảm ơn vì sự trả lời!
thomasvdb

4
Giải pháp trên chỉ sử dụng JQuery để chờ tải tài liệu. Mọi thứ khác là thuần túy JS và DOM. Một trình duyệt đủ hiện đại để hỗ trợ setCustomValids cũng sẽ hỗ trợ sự kiện DOMContentLoaded, nghĩa là không cần JQuery, nếu nó không được sử dụng cho bất kỳ điều gì khác.
itpastorn

1
@ Lai32290 vì bạn không truy cập đối tượng DOM thực tế. $("")trả về một mảng các đối tượng, ngay cả khi chỉ có một. $("")[i]rất có thể là những gì bạn muốn.

290

Đây là mã để xử lý Thông báo lỗi tùy chỉnh trong HTML5

<input type="text" id="username" required placeholder="Enter Name"
    oninvalid="this.setCustomValidity('Enter User Name Here')"
    oninput="this.setCustomValidity('')"  />

Phần này rất quan trọng vì nó ẩn thông báo lỗi khi người dùng nhập dữ liệu mới:

oninput="this.setCustomValidity('')"

Hoạt động hoàn hảo trên Firefox 29.0 và Chrome 34.0.1847.137.
Fernando Kosh

hoàn hảo và trong FF 38 cho đến nay. Sửa lỗi xác thực email nếu chỉ sử dụng oninvalid ().
andrew

Không hoạt động trong Safari trong iPad cũng như iPhone. Hoạt động như mong đợi trong máy tính để bàn Chrome mặc dù.
Nabeel

2
@ somnath-kadam Đó có phải là lỗi hay bạn cố tình làm oninput = "setCustomValids ('')" thay vì oninput = "this.setCustomValids ('')"
tormuto

3
Cảm ơn bạn đã đánh dấu oninput = "setCustomValids ('')" là quan trọng nhất. Điều này đã cứu ngày của tôi.
singhpradeep

99

Rất đơn giản để kiểm soát thư tùy chỉnh với sự trợ giúp của HTML5sự kiệnoninvalid

Đây là mã:

<input id="UserID"  type="text" required="required"
       oninvalid="this.setCustomValidity('Witinnovation')"
       onvalid="this.setCustomValidity('')">

Điều này là quan trọng nhất:

onvalid="this.setCustomValidity('')"

3
Ngoài ra, hãy kiểm tra các xác nhận khác cũng như mẫu, giá trị tối thiểu / tối đa, v.v ... sanalksankar.blogspot.com/2010/12/ trên
Jaider

10
Điều này gây ra lỗi trong firefox khi nó xác nhận khi làm mới, nhưng không thành công khi thay đổi và sửa.
Ryan Charmley

12
@RyanCharmley bằng cách sử dụng onchange="this.setCustomValidity('')"lỗi sẽ biến mất. Kiểm tra câu trả lời của tôi dưới đây.
Salar

4
Nếu điều này không hoạt động (ví dụ như nó không có trong Safari), hãy sử dụng oninputthay vì onvalid.
Jimothy

2
@Jimothy nói đúng về điều này, oninputlà giải pháp phổ quát hơn, onvalidkhông hoạt động ngay cả trong Chrome đối với tôi.
ThisGuyCantEven

68

Lưu ý: Điều này không còn hoạt động trong Chrome, không được thử nghiệm trong các trình duyệt khác. Xem các chỉnh sửa dưới đây. Câu trả lời này đang được để lại ở đây để tham khảo lịch sử.

Nếu bạn cảm thấy rằng chuỗi xác thực thực sự không nên được đặt theo mã, bạn có thể đặt thuộc tính tiêu đề của phần tử đầu vào thành "Trường này không thể để trống". (Hoạt động trong Chrome 10)

title="This field should not be left blank."

Xem http://jsfiddle.net/kaleb/nfgfP/8/

Và trong Firefox, bạn có thể thêm thuộc tính này:

x-moz-errormessage="This field should not be left blank."

Biên tập

Điều này dường như đã thay đổi kể từ khi tôi viết câu trả lời này. Bây giờ thêm một tiêu đề không thay đổi thông báo hợp lệ, nó chỉ thêm một phụ lục vào tin nhắn. Các fiddle ở trên vẫn áp dụng.

Chỉnh sửa 2

Chrome hiện không làm gì với thuộc tính tiêu đề như Chrome 51. Tôi không chắc phiên bản này đã thay đổi.


1
Điều này không thay đổi nội dung tin nhắn thực tế.
Wesley Murch

2
Tại thời điểm tôi kiểm tra nó đã làm.
kzh

3
Lỗi của tôi, OP đã chỉ định Chrome 10, tôi đã ở trên FF5. Đã gỡ bỏ downvote, lời xin lỗi của tôi. Ồ, thông báo lỗi đó trong Chrome là thứ xấu nhất tôi từng thấy.
Wesley Murch

2
Đối với các thông báo lỗi khai báo trong Firefox, hãy sử dụng thuộc tính:x-moz-errormessage="This field should not be left blank."
robertc

2
Điều này thêm một thông điệp mô tả trong phần "Vui lòng điền vào trường này".
Magne

41

Rất đơn giản để kiểm soát tin nhắn tùy chỉnh với sự trợ giúp của HTML5 oninvalidsự kiện

Đây là mã:

User ID 
<input id="UserID"  type="text" required 
       oninvalid="this.setCustomValidity('User ID is a must')">

4
bắt buộc phải đặt thông báo hợp lệ thành trống sau khi điều khiển trả lại thông tin hợp lệ được thực thi đầu tiên khác sẽ được hiển thị cho tất cả các trường. Thêm oninput = "setCustomValids ('')" bất cứ khi nào gọi setCustomValids (). +1 cho câu trả lời của Somnath.
Tarang

41

Bằng cách cài đặt và bỏ cài đặt setCustomValidityđúng thời điểm, thông báo xác thực sẽ hoạt động hoàn hảo.

<input name="Username" required 
oninvalid="this.setCustomValidity('Username cannot be empty.')" 
onchange="this.setCustomValidity('')" type="text" />

Tôi đã sử dụng onchangethay vì oninputchung chung hơn và xảy ra khi giá trị được thay đổi trong bất kỳ điều kiện nào ngay cả thông qua JavaScript.


Đây phải là câu trả lời được chấp nhận. Đã hoạt động trong Windows 10 1709 trong các trình duyệt sau: Chrome 66.0.3359.139 64 bit, Firefox 59.0.3 (64 bit), Internet Explorer 11.431.16299.0, Edge 41.16299.402.0. Đã làm việc trong macOS 10.13.2 trong Safari 11.0 (13604.1.38.1.6). Đã hoạt động trong Android 4.4.4 trong Chrome 66.0.3359.158. Đối với những người tìm kiếm cách JSX : onInvalid={(e) => { e.target.setCustomValidity('foo') }} onChange={(e) => { e.target.setCustomValidity('') }}.
GuiRitter

Phụ lục: ecó thể là null, ví dụ: khi một tùy chọn bị xóa khỏi trường Chọn Phản ứng. Đừng quên kiểm tra điều đó.
GuiRitter

Errata: để sử dụng tính năng này với React Select, bạn phải vượt qua onChangeonInvalidnhưinputProps={{ onInvalid: …, onChange: …, }}
GuiRitter

Phụ Lục: type='email'là khó khăn hơn một chút để điều trị, vì sử dụng setCustomValiditybộ customError: trueđể e.target.validityngay cả khi đầu vào là hợp lệ. Tôi đang cố gắng tìm cách khắc phục nó.
GuiRitter

@GuiRitter Bạn đã tìm ra điều này?
EvilJordan

39

Tôi đã tạo một thư viện nhỏ để dễ dàng thay đổi và dịch các thông báo lỗi. Bạn thậm chí có thể thay đổi văn bản theo loại lỗi hiện không có sẵn bằng titleChrome hoặc x-moz-errormessagetrong Firefox. Hãy kiểm tra nó trên GitHub và đưa ra phản hồi.

Nó được sử dụng như:

<input type="email" required data-errormessage-value-missing="Please input something">

Có một bản demo có sẵn tại jsFiddle .


Cảm ơn! Đã giải quyết lỗi nhỏ của tôi được đề cập như một nhận xét trong câu trả lời được chấp nhận.
thomasvdb

Câu trả lời tốt, vì OP đang sử dụng Google Chrome; Điều này sẽ không hoạt động trong IE Edge
CoderHawk

23

Hãy thử cái này, nó tốt hơn và được thử nghiệm:

HTML:

<form id="myform">
    <input id="email" 
           oninvalid="InvalidMsg(this);" 
           oninput="InvalidMsg(this);"
           name="email"  
           type="email" 
           required="required" />
    <input type="submit" />
</form>

JAVASCRIPT:

function InvalidMsg(textbox) {
    if (textbox.value === '') {
        textbox.setCustomValidity('Required email address');
    } else if (textbox.validity.typeMismatch){
        textbox.setCustomValidity('please enter a valid email address');
    } else {
       textbox.setCustomValidity('');
    }

    return true;
}

Bản giới thiệu:

http://jsfiddle.net/patelriki13/Sqq8e/


này .... giải pháp hay nhưng gõ = email không hoạt động trong trình duyệt safari. có một cái nhìn w3schools.com/html/html_form_input_types.asp
Bhawna Malhotra

2
Có, nó không được hỗ trợ cho safari, nhưng tôi đã đưa ra câu trả lời cho việc đặt thông báo xác thực tùy chỉnh.
Rikin Patel

10

Cách dễ nhất và sạch nhất tôi đã tìm thấy là sử dụng thuộc tính dữ liệu để lưu trữ lỗi tùy chỉnh của bạn. Kiểm tra tính hợp lệ của nút và xử lý lỗi bằng cách sử dụng một số html tùy chỉnh.nhập mô tả hình ảnh ở đây

javascript

if(node.validity.patternMismatch)
        {
            message = node.dataset.patternError;
        }

và một số siêu HTML5

<input type="text" id="city" name="city" data-pattern-error="Please use only letters for your city." pattern="[A-z ']*" required>

3
Mặc dù lỗi chỉ nói các chữ cái, mẫu cho phép không gian và dấu nháy đơn? Ngoài ra, A-zcho phép '[', '\', ']', '^', '_' và '`'.
Lawrence Dol

5

Giải pháp ngăn chặn thông báo lỗi Google Chrome khi nhập từng ký hiệu:

<p>Click the 'Submit' button with empty input field and you will see the custom error message. Then put "-" sign in the same input field.</p>
<form method="post" action="#">
  <label for="text_number_1">Here you will see browser's error validation message on input:</label><br>
  <input id="test_number_1" type="number" min="0" required="true"
         oninput="this.setCustomValidity('')"
         oninvalid="this.setCustomValidity('This is my custom message.')"/>
  <input type="submit"/>
</form>

<form method="post" action="#">
  <p></p>
  <label for="text_number_1">Here you will see no error messages on input:</label><br>
  <input id="test_number_2" type="number" min="0" required="true"
         oninput="(function(e){e.setCustomValidity(''); return !e.validity.valid && e.setCustomValidity(' ')})(this)"
         oninvalid="this.setCustomValidity('This is my custom message.')"/>
  <input type="submit"/>
</form>


3

Tôi có một giải pháp vanilla js đơn giản hơn:

Đối với các hộp kiểm:

document.getElementById("id").oninvalid = function () {
    this.setCustomValidity(this.checked ? '' : 'My message');
};

Đối với đầu vào:

document.getElementById("id").oninvalid = function () {
    this.setCustomValidity(this.value ? '' : 'My message');
};

1

Thích ứng Salar câu trả lời 's để JSX và phản ứng, tôi nhận thấy rằng Phản ứng Chọn không cư xử giống như một <input/>lĩnh vực liên quan đến xác nhận. Rõ ràng, một số cách giải quyết là cần thiết để chỉ hiển thị thông báo tùy chỉnh và để giữ cho nó không hiển thị vào thời điểm bất tiện.

Tôi đã nêu ra một vấn đề ở đây , nếu nó giúp bất cứ điều gì. Đây là một CodeSandbox với một ví dụ hoạt động và mã quan trọng nhất được sao chép ở đây:

Xin chào

import React, { Component } from "react";
import SelectValid from "./SelectValid";

export default class Hello extends Component {
  render() {
    return (
      <form>
        <SelectValid placeholder="this one is optional" />
        <SelectValid placeholder="this one is required" required />
        <input
          required
          defaultValue="foo"
          onChange={e => e.target.setCustomValidity("")}
          onInvalid={e => e.target.setCustomValidity("foo")}
        />
        <button>button</button>
      </form>
    );
  }
}

ChọnValid.js

import React, { Component } from "react";
import Select from "react-select";
import "react-select/dist/react-select.css";

export default class SelectValid extends Component {
  render() {
    this.required = !this.props.required
      ? false
      : this.state && this.state.value ? false : true;
    let inputProps = undefined;
    let onInputChange = undefined;
    if (this.props.required) {
      inputProps = {
        onInvalid: e => e.target.setCustomValidity(this.required ? "foo" : "")
      };
      onInputChange = value => {
        this.selectComponent.input.input.setCustomValidity(
          value
            ? ""
            : this.required
              ? "foo"
              : this.selectComponent.props.value ? "" : "foo"
        );
        return value;
      };
    }
    return (
      <Select
        onChange={value => {
          this.required = !this.props.required ? false : value ? false : true;
          let state = this && this.state ? this.state : { value: null };
          state.value = value;
          this.setState(state);
          if (this.props.onChange) {
            this.props.onChange();
          }
        }}
        value={this && this.state ? this.state.value : null}
        options={[{ label: "yes", value: 1 }, { label: "no", value: 0 }]}
        placeholder={this.props.placeholder}
        required={this.required}
        clearable
        searchable
        inputProps={inputProps}
        ref={input => (this.selectComponent = input)}
        onInputChange={onInputChange}
      />
    );
  }
}

1

Được rồi, oninvalid hoạt động tốt nhưng nó hiển thị lỗi ngay cả khi người dùng nhập dữ liệu hợp lệ. Vì vậy, tôi đã sử dụng dưới đây để giải quyết nó, hy vọng nó cũng sẽ làm việc cho bạn,

oninvalid="this.setCustomValidity('Your custom message.')" onkeyup="setCustomValidity('')"


-7

Có thể dễ dàng xử lý bằng cách chỉ cần đặt 'tiêu đề' với trường:

<input type="text" id="username" required title="This field can not be empty"  />

Điều này không thay đổi thông báo lỗi hiển thị. Nó chỉ hiển thị một tiêu đề trên đầu vào khi bạn di chuột.
Mathieu Dumoulin

Đây không phải là khả năng sử dụng chính xác của "tiêu đề" để hiển thị một số cảnh báo cho trường đầu vào.
sajad saderi
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.