HTML5 양식 필수 속성 맞춤 확인 메시지를 설정 하시겠습니까?


326

다음 HTML5 양식이 있습니다. 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"/>

현재 둘 다 비어있을 때 Enter 키를 누르면 "이 필드를 입력하십시오"라는 팝업 상자가 나타납니다. 기본 메시지를 "이 필드는 비워 둘 수 없습니다"로 어떻게 변경합니까?

편집 : 또한 암호 입력 필드의 오류 메시지는 간단 *****합니다. 이것을 다시 만들려면 사용자 이름에 값을 지정하고 제출을 누르십시오.

편집 : 테스트에 Chrome 10을 사용하고 있습니다. 똑같이 해주세요


1
오, 미친 빈 암호 유효성 검사 메시지에 +1 = / 어떻게 QA를 통과했는지 궁금합니다.
David는 Monica를

3
왜 브라우저 기본 메시지를 수락하지 않습니까? 그것이 그들이 방문하는 다른 모든 사이트에 대해 사용자가 보는 것입니다. 비표준 메시지를 작성하여 사용자를 혼란스럽게 할뿐입니다. (Google은 아마도 귀하보다 그 문구를 결정하는 데 더 많은 UX 평가 및 테스트를 관리했습니다!).
ChrisV

12
@ChrisV 다국어 사이트는 어떻습니까?
inemanja

1
필자의 경우 게시하기 전에 값이 숫자인지 확인하고 싶지만 type = "number"속성을 사용할 수 없습니다 (따라서). 패턴 속성을 설정하여 숫자와 선택적 소수를 확인하여 메시지를 표시합니다. , 오류가 발생하면 "요청한 형식과 일치하십시오." 차라리 "너희에게 많은 돈을 선물해야한다"고 말했다.
Kristopher

답변:


267

사용 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("");
        };
    }
})

나는 바닐라 자바 스크립트로 변경 에 의해 제안 Mootools의에서 @itpastorn 코멘트에,하지만 당신은 필요한 경우 동등한 Mootools의를 해결 할 수 있어야한다.

편집하다

setCustomValidity원래 답변했을 때 이해 한 것과 약간 다르게 작동 하므로 여기에서 코드를 업데이트했습니다 . setCustomValidity빈 문자열 이외의 것으로 설정된 경우 필드가 유효하지 않은 것으로 간주됩니다. 따라서 유효성을 테스트하기 전에 지워야합니다. 설정 만하고 잊을 수는 없습니다.

추가 편집

아래의 @thomasvdb의 의견에서 지적했듯이 일부 이벤트 이외의 invalid경우 사용자 지정 유효성 oninvalid을 지워야합니다. 그렇지 않으면 처리기를 통과하여 추가 로 지울 수 있습니다.


나는 이것을 시도했지만 여전히 오류가 있습니다. 필드를 비워두면 메시지가 표시되고 필드에 무언가를 입력하지만 빈 메시지가 표시되고 작업이 실행되지 않습니다. 이제 버튼을 다시 클릭하면 통과합니다.
thomasvdb

1
@thomasvdb input이벤트 에서 사용자 지정 유효성을 빈 문자열로 설정해보십시오 . 현재 invalid이벤트가 시작되면 지워집니다 .
robertc

이것이 실제로 해결책입니다. @hleinone의 솔루션으로 그것을 발견했습니다. 답변 주셔서 감사합니다!
thomasvdb

4
위의 솔루션은 JQuery 만 사용하여 문서가로드 될 때까지 기다립니다. 그 밖의 모든 것은 순수한 JS와 DOM입니다. setCustomValidity를 지원할 수있는 최신 브라우저는 DOMContentLoaded 이벤트도 지원해야합니다. 즉, 다른 용도로 사용하지 않는 경우 JQuery가 필요하지 않습니다.
itpastorn

1
실제 DOM 객체에 액세스하지 않기 때문에 @ Lai32290 $("")하나만있는 경우에도 객체 배열을 반환합니다. $("")[i]아마도 당신이 원하는 것입니다.
Noah Passalacqua

289

다음은 HTML5 에서 맞춤 오류 메시지를 처리하는 코드입니다.

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

이 부분은 사용자가 새 데이터를 입력 할 때 오류 메시지를 숨기므로 중요합니다.

oninput="this.setCustomValidity('')"

Firefox 29.0 및 Chrome 34.0.1847.137에서 완벽하게 작동합니다.
Fernando Kosh

완벽하고 FF 38까지. oninvalid () 만 사용되는 경우 이메일 유효성 검사 버그를 수정합니다.
앤드류

iPad 나 iPhone의 Safari에서는 작동하지 않습니다. 그래도 Chrome 데스크톱에서 예상대로 작동합니다.
Nabeel

2
@ somnath-kadam 실수입니까, 아니면 실수로 oninput = "this.setCustomValidity ( '')"대신 oninput = "setCustomValidity ( '')"를
했음

3
oninput = "setCustomValidity ( '')"를 가장 중요하게 표시해 주셔서 감사합니다. 이것은 나의 하루를 구했다.
singhpradeep

99

HTML5이벤트 의 도움으로 사용자 정의 메시지를 제어하는 ​​것은 매우 간단합니다oninvalid

코드는 다음과 같습니다.

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

이것은 가장 중요합니다 :

onvalid="this.setCustomValidity('')"

3
패턴, 최소 / 최대 값 등과 같은 다른 유효성 검사도 확인하십시오. sanalksankar.blogspot.com/2010/12/…
Jaider

10
파이어 폭스에서 새로 고침시 유효성을 검사하는 버그가 발생하지만 변경 및 수정시 실패합니다.
Ryan Charmley

12
@RyanCharmley onchange="this.setCustomValidity('')"는 버그 를 사용 하여 사라질 것입니다. 아래에서 내 대답을 확인하십시오.
Salar

4
이것이 작동하지 않으면 (예를 들어 Safari에서는 작동하지 않음) oninput대신을 사용하십시오 onvalid.
Jimothy

2
@Jimothy는 이것에 대해 맞습니다 oninput.보다 보편적 인 솔루션이며 onvalidChrome에서도 작동하지 않았습니다.
ThisGuyCant6

68

참고 : Chrome에서는 더 이상 작동하지 않으며 다른 브라우저에서는 테스트되지 않았습니다. 아래 수정 사항을 참조하십시오. 이 답변은 역사적 참고를 위해 여기에 남아 있습니다.

유효성 검사 문자열이 실제로 코드로 설정되어서는 안된다고 생각되면 입력 요소의 제목 속성을 "이 필드는 비워 둘 수 없습니다"라고 읽도록 설정할 수 있습니다. (Chrome 10에서 작동)

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

http://jsfiddle.net/kaleb/nfgfP/8/ 참조

그리고 Firefox에서는 다음 속성을 추가 할 수 있습니다.

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

편집하다

원래이 답변을 작성한 이후로 변경된 것 같습니다. 이제 제목을 추가해도 유효성 메시지가 변경되지 않고 단지 메시지에 부록이 추가됩니다. 위의 바이올린은 여전히 ​​적용됩니다.

편집 2

Chrome은 현재 Chrome 51에서 title 속성을 사용하지 않습니다. 어떤 버전으로 변경되었는지 확실하지 않습니다.


1
실제 메시지 내용은 변경되지 않습니다.
웨슬리 머치

2
나는 그것을 테스트 할 때했다.
kzh

3
내 실수로 OP는 Chrome 10을 지정했으며 FF5를 사용했습니다. downvote, 사과를 제거했습니다. 와우, Chrome의 오류 메시지는 내가 본 것 중 가장 추악한 것입니다.
웨슬리 머치

2
Firefox에서 선언적인 오류 메시지를 보려면 다음 속성을 사용하십시오.x-moz-errormessage="This field should not be left blank."
robertc

2
"이 필드를 입력하십시오"아래에 설명 메시지가 추가됩니다.
Magne

41

HTML5 oninvalid이벤트 의 도움으로 사용자 정의 메시지를 제어하는 ​​것은 매우 간단합니다

코드는 다음과 같습니다.

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

4
제어가 입력을 받으면 유효성 메시지를 공백으로 설정해야합니다. 그렇지 않으면 모든 필드에 대해 처음 실행 된 유효성 메시지가 표시됩니다. setCustomValidity ()를 호출 할 때마다 oninput = "setCustomValidity ( '')"를 추가하십시오. Somnath의 답변에 +1.
Tarang

41

setCustomValidity적시에 를 설정 및 설정 해제하면 유효성 검사 메시지가 완벽하게 작동합니다.

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

나는 더 일반적이며 JavaScript를 통해 어떤 조건에서든 값이 변경 될 때 onchange대신 사용 됩니다 oninput.


이것은 정답입니다. Windows 10 1709에서 Chrome 66.0.3359.139 64 비트, Firefox 59.0.3 (64 비트), Internet Explorer 11.431.16299.0, Edge 41.16299.402.0 브라우저에서 작동했습니다. Safari 11.0 (13604.1.38.1.6)의 macOS 10.13.2에서 작동했습니다. Chrome 66.0.3359.158의 Android 4.4.4에서 작동했습니다. JSX 방식을 찾는 사람들에게 : onInvalid={(e) => { e.target.setCustomValidity('foo') }} onChange={(e) => { e.target.setCustomValidity('') }}.
GuiRitter

부록 : e예를 들어 옵션이 반응 선택 필드에서 제거 된 경우 null 일 수 있습니다. 그것을 확인하는 것을 잊지 마십시오.
GuiRitter

에라타 : 이것을 React Select와 함께 사용하려면 다음 onChangeonInvalid같이해야합니다.inputProps={{ onInvalid: …, onChange: …, }}
GuiRitter

부록 : 입력이 유효하더라도 세트 를 type='email'사용하기 때문에 취급하기가 조금 더 어렵습니다 . 문제를 해결하는 방법을 찾으려고합니다. setCustomValiditycustomError: truee.target.validity
GuiRitter

@GuiRitter 이거 알아 냈어?
EvilJordan

39

오류 메시지를 쉽게 변경하고 번역 할 수 있도록 작은 라이브러리를 만들었습니다. titleChrome 또는 x-moz-errormessageFirefox 에서는 현재 사용할 수없는 오류 유형으로 텍스트를 변경할 수도 있습니다 . 이동 GitHub의에 그것을 확인 하고 피드백을 제공합니다.

다음과 같이 사용됩니다.

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

있다 jsFiddle에서 사용할 수 데모 .


감사! 허용 된 답변에 주석으로 언급 된 내 작은 버그를 해결했습니다.
thomasvdb

OP가 Chrome을 사용하고 있기 때문에 좋은 답변입니다. 이것은 IE Edge에서 작동하지 않는다는 것을
알았습니다

23

더 나은 테스트를 거친이 제품을 사용해보십시오.

HTML :

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

자바 스크립트 :

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;
}

데모:

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


이봐 .... 좋은 솔루션이지만 type = email은 사파리 브라우저에서 작동하지 않습니다. 좀보세요 w3schools.com/html/html_form_input_types.asp
Bhawna Malhotra

2
예, 사파리에서는 지원되지 않지만 사용자 정의 유효성 검사 메시지 설정에 대한 답변을 제공했습니다.
Rikin Patel

10

내가 찾은 가장 쉽고 깨끗한 방법은 데이터 속성을 사용하여 사용자 지정 오류를 저장하는 것입니다. 노드가 유효한지 테스트하고 일부 사용자 정의 HTML을 사용하여 오류를 처리하십시오.여기에 이미지 설명을 입력하십시오

르 자바 스크립트

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

그리고 일부 슈퍼 HTML5

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

3
문자 만 말하는 오류에도 불구하고 패턴은 공간과 아포스트로피를 허용합니까? 또한 A-z'[', '\', ']', '^', '_'및 '`'도 허용합니다.
Lawrence Dol

5

Chrome 오류 메시지를 방지하기위한 솔루션은 각 기호를 입력합니다.

<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

더 간단한 바닐라 js 전용 솔루션이 있습니다.

확인란의 경우 :

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

입력의 경우 :

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

1

적응 Salar는 JSX에의 대답과 반작용, 나는 선택이 단지처럼 행동하지 않는 반작용 것으로 나타났습니다 <input/>검증에 대한 필드. 사용자 지정 메시지 만 표시하고 불편한 시간에 표시되지 않도록하려면 몇 가지 해결 방법이 필요합니다.

도움이된다면 여기서 문제를 제기했습니다 . 다음 은 실제 예제가있는 CodeSandbox이며 가장 중요한 코드는 여기에 재현되어 있습니다.

Hello.js

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>
    );
  }
}

SelectValid.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

좋아, oninvalid는 잘 작동하지만 사용자가 유효한 데이터를 입력해도 오류가 표시됩니다. 아래에서 문제를 해결하는 데 사용했습니다.

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


-7

필드에 'title'을 넣으면 쉽게 처리 할 수 ​​있습니다.

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

표시된 오류 메시지는 변경되지 않습니다. 마우스를 올리면 입력에 제목 만 표시됩니다.
Mathieu Dumoulin

입력 필드에 대한 경고를 표시하는 "제목"의 올바른 사용성은 아닙니다.
sajad saderi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.