แอตทริบิวต์ที่ต้องใช้ของฟอร์ม 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 ฉันสงสัยว่า ...
เดวิดพูดว่าคืนสถานะโมนิก้า

3
ทำไมไม่เพียงแค่ยอมรับข้อความเริ่มต้นของเบราว์เซอร์? นั่นคือสิ่งที่ผู้ใช้เห็นสำหรับทุก ๆ ไซต์ที่พวกเขาเยี่ยมชมคุณเพียงแค่ทำให้ผู้ใช้สับสนโดยการสร้างข้อความที่ไม่ได้มาตรฐาน (Google อาจจัดการการประเมินและทดสอบ UX มากขึ้นในการพิจารณาถ้อยคำนั้นมากกว่าที่คุณมี!)
ChrisV

12
@ChrisV แล้วเว็บไซต์เกี่ยวกับหลายภาษาล่ะ?
inemanja

1
ในกรณีของฉันฉันต้องการตรวจสอบว่าค่าเป็นตัวเลขก่อนการโพสต์ แต่ฉันไม่สามารถใช้คุณลักษณะ type = "number" (ด้วยเหตุผล) ดังนั้นฉันจึงตั้งค่าแอตทริบิวต์ pattern เพื่อตรวจสอบตัวเลขและทศนิยมที่เป็นตัวเลือกที่ให้ข้อความ "โปรดจับคู่รูปแบบที่ร้องขอ" โดยมีข้อผิดพลาด ฉันอยากบอกว่า "เจ้าต้องให้ของขวัญกับเราจำนวนหนึ่ง"
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("");
        };
    }
})

ฉันเปลี่ยนเป็น vanilla JavaScriptจาก 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
@ Lai32290 เพราะคุณไม่ได้เข้าถึงวัตถุ DOM ที่แท้จริง $("")ส่งกลับอาร์เรย์ของวัตถุแม้ว่าจะมีเพียงหนึ่ง $("")[i]มีแนวโน้มมากที่สุดที่คุณต้องการ
โนอาห์ 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 ()
แอนดรู

ไม่ทำงานใน Safari ใน iPad หรือ iPhone ทำงานได้ตามที่คาดหวังในเดสก์ท็อป Chrome แม้ว่า
Nabeel

2
@ somnath-kadam มันเป็นความผิดพลาดหรือคุณตั้งใจทำ oninput = "setCustomValidity ('')" แทนที่จะเป็น oninput = "this.setCustomValidity ('')"
tormuto

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
สิ่งนี้ทำให้เกิดบั๊กใน Firefox ซึ่งตรวจสอบได้เมื่อรีเฟรช แต่ล้มเหลวเมื่อเปลี่ยนแปลงและแก้ไข
Ryan Charmley

12
@RyanCharmley โดยใช้onchange="this.setCustomValidity('')"ข้อบกพร่องจะหายไป ตรวจสอบคำตอบของฉันด้านล่าง
Salar

4
หากยังไม่สามารถทำงานได้ (มันไม่ได้ใน Safari เป็นต้น) ใช้แทนoninput onvalid
Jimothy

2
@Jimothy ถูกต้องเกี่ยวกับเรื่องนี้oninputเป็นทางออกที่เป็นสากลมากขึ้นonvalidไม่ทำงานแม้แต่ใน Chrome สำหรับฉัน
ThisGuyCantEven

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 ฉันไม่แน่ใจว่ารุ่นนี้มีการเปลี่ยนแปลงอย่างไร


1
สิ่งนี้ไม่เปลี่ยนเนื้อหาข้อความจริง
Wesley Murch

2
ตอนที่ฉันทำการทดสอบ
kzh

3
ความผิดพลาดของฉัน OP ระบุ Chrome 10 ฉันใช้ FF5 ลบ downvote คำขอโทษของฉัน ว้าวข้อความผิดพลาดใน Chrome เป็นสิ่งที่น่าประหลาดใจที่สุดที่ฉันเคยเห็น
Wesley Murch

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
มันจะต้องตั้งค่าข้อความความถูกต้องเป็นว่างเปล่าเมื่อควบคุมเผยให้เห็นการป้อนข้อมูลอื่นข้อความความถูกต้องดำเนินการครั้งแรกจะปรากฏขึ้นสำหรับฟิลด์ทั้งหมด เพิ่ม oninput = "setCustomValidity ('')" ทุกครั้งที่โทร setCustomValidity () +1 กับคำตอบของ Somnath
Tarang

41

โดยการตั้งค่าและยกเลิกการตั้งค่าsetCustomValidityในเวลาที่เหมาะสมข้อความการตรวจสอบจะทำงานได้อย่างไม่มีที่ติ

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

ฉันใช้onchangeแทนoninputซึ่งเป็นเรื่องทั่วไปมากขึ้นและเกิดขึ้นเมื่อมีการเปลี่ยนแปลงค่าในเงื่อนไขใด ๆ แม้ผ่าน JavaScript


นี่ควรเป็นคำตอบที่ยอมรับได้ ทำงานใน 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 ทำงานใน macOS 10.13.2 ใน Safari 11.0 (13604.1.38.1.6) ทำงานใน Android 4.4.4 ใน Chrome 66.0.3359.158 สำหรับผู้ที่มองหาวิธีที่ onInvalid={(e) => { e.target.setCustomValidity('foo') }} onChange={(e) => { e.target.setCustomValidity('') }}JSX:
GuiRitter

ภาคผนวก: eอาจเป็นโมฆะตัวอย่างเช่นเมื่อตัวเลือกถูกลบออกจากฟิลด์เลือกการตอบสนอง อย่าลืมตรวจสอบสิ่งนั้น
GuiRitter

ข้อผิดพลาด: การใช้สิ่งนี้กับ React Select คุณต้องผ่านonChangeและonInvalidเป็นinputProps={{ onInvalid: …, onChange: …, }}
GuiRitter

ภาคผนวก: type='email'เป็นเรื่องยากขึ้นเล็กน้อยเนื่องจากการใช้setCustomValidityชุดcustomError: trueถึงe.target.validityแม้ว่าอินพุตจะถูกต้อง ฉันพยายามหาวิธีแก้ไข
GuiRitter

@GuiRitter คุณเข้าใจเรื่องนี้ไหม?
EvilJordan

39

ฉันได้สร้างห้องสมุดเล็ก ๆ เพื่อให้ง่ายต่อการเปลี่ยนแปลงและแปลข้อความแสดงข้อผิดพลาด คุณสามารถเปลี่ยนข้อความตามประเภทข้อผิดพลาดซึ่งไม่สามารถใช้ได้titleใน Chrome หรือx-moz-errormessageFirefox ไปตรวจสอบกับ GitHubและให้ข้อเสนอแนะ

มันใช้เช่น:

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

มีความพร้อมใช้งานสนุกที่ jsFiddle


ขอบคุณ! แก้ไขข้อผิดพลาดเล็ก ๆ ของฉันที่กล่าวถึงเป็นความคิดเห็นในคำตอบที่ได้รับการยอมรับ
thomasvdb

คำตอบที่ดีเนื่องจาก OP ใช้ Google Chrome; เจ้าสิ่งนี้จะไม่ทำงานใน IE Edge
CoderHawk

23

ลองอันนี้ดีกว่าและทดสอบแล้ว:

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

การสาธิต:

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


เฮ้ .... วิธีแก้ปัญหาที่ดี แต่การพิมพ์ = อีเมลไม่ทำงานในเบราว์เซอร์ซาฟารี ลองดูw3schools.com/html/html_form_input_types.asp
Bhawna Malhotra

2
ใช่ไม่รองรับซาฟารี แต่ฉันได้รับคำตอบสำหรับข้อความยืนยันที่กำหนดเอง
Rikin Patel

10

วิธีที่ง่ายและสะอาดที่สุดที่ฉันพบคือใช้ data data ในการจัดเก็บข้อผิดพลาดที่กำหนดเองของคุณ ทดสอบโหนดเพื่อตรวจสอบความถูกต้องและจัดการข้อผิดพลาดโดยใช้ html ที่กำหนดเองป้อนคำอธิบายรูปภาพที่นี่

le javascript

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

โซลูชันสำหรับป้องกันข้อความแสดงข้อผิดพลาดของ Google 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 และ React ฉันสังเกตเห็นว่า React Select ไม่ได้ทำงานเหมือนกับการ<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

สามารถจัดการได้ง่ายเพียงแค่ใส่ 'ชื่อ' กับฟิลด์:

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