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を不思議ましたか...
ダビデはREINSTATEモニカ言う

3
ブラウザーのデフォルトメッセージをそのまま受け入れないのはなぜですか?これは、ユーザーがアクセスする他のすべてのサイトでユーザーに表示されるものです。標準以外のメッセージを作成して、ユーザーを混乱させるだけです。(Googleはおそらく、あなたが持っているよりも多くのUXの評価とテストを行って、その表現を決定しました!)。
ChrisV

12
@ChrisV多言語サイトはどうですか?
inemanja 2013年

1
私の場合、投稿する前に値が数値であることを確認したいのですが、type = "number"属性を使用できません(理由により)。パターン属性を設定して、数値とオプションの小数をチェックし、メッセージを表示します、「要求されたフォーマットと一致してください」エラー。私はむしろ「あなたは私たちにたくさんの額を贈らなければならない」と言ったのです。
クリストファー2017年

回答:


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

コメントで@itpastornが示唆しているように、MootoolsからバニラJavaScript変更しましたが、必要に応じて、Mootoolsの同等の機能を実行できるはずです。

編集する

私がsetCustomValidity最初に答えたときに理解したものとは少し異なる動作をするように、ここでコードを更新しました。場合はsetCustomValidity、空の文字列以外に設定されている、それはフィールドが無効とみなされるようになります。したがって、有効性をテストする前にそれをクリアする必要があります。設定して忘れることはできません。

さらに編集

以下の@thomasvdbのコメントで指摘されているように、イベントの外でカスタムの有効性をクリアする必要invalidがあります。それ以外の場合は、oninvalidハンドラーを介して追加のパスをクリアしてクリアする必要がある場合があります。


私はこれを試しましたが、まだエラーがあります。フィールドを空のままにすると、メッセージが表示され、フィールドに何かを入力しますが、空のメッセージが表示され、アクションは実行されません。ボタンをもう一度クリックすると、ボタンが通過します。
thomasvdb 2012

1
@thomasvdb inputイベントでカスタムの有効性を空の文字列に設定してみてください。現時点では、invalidイベントが発生した場合にのみクリアされます。
robertc 2012

これは確かに解決策です。@hleinoneのソリューションで見つけました。回答ありがとうございます!
thomasvdb 2012

4
上記のソリューションでは、JQueryを使用して、ドキュメントが読み込まれるのを待ちます。その他はすべて純粋なJSとDOMです。setCustomValidityをサポートするのに十分な最新のブラウザーは、DOMContentLoadedイベントもサポートする必要があります。つまり、JQueryが他で使用されていない場合、JQueryは必要ありません。
itpastorn 2013年

1
@ Lai32290は、実際のDOMオブジェクトにアクセスしていないためです。$("")オブジェクトが1つしかない場合でも、オブジェクトの配列を返します。$("")[i]おそらくあなたが望むものです。
Noah Passalacqua、2016年

290

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 14年

今のところ完璧でFF38です。oninvalid()のみが使用されている場合の電子メール検証のバグを修正します。
andrew

iPadやiPhoneのSafariで動作しません。Chromeデスクトップで期待どおりに動作します。
Nabeel

2
@ somnath-kadam間違いですか、または意図的にoninput = "this.setCustomValidity( '')"ではなくoninput = "setCustomValidity( '')"を実行しました
tormuto

3
oninput = "setCustomValidity( '')"を最も重要としてマークしていただきありがとうございます。これは私の日を救った。
singhpradeep 2017年

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 2013

12
onchange="this.setCustomValidity('')"バグを使用した@RyanCharmley はなくなります。以下の私の答えを確認してください。
Salar

4
これが機能しない場合(たとえば、Safariでは機能しない)、のoninput代わりにを使用しますonvalid
ジモシー2018年

2
@Jimothyはこれについて正しくoninput、より普遍的なソリューションでonvalidあり、Chromeでも機能しませんでした。
ThisGuyCantEven 2018年

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 51の時点で、title属性でChromeは何もしません。これが変更されたバージョンはわかりません。


1
これは実際のメッセージの内容を変更しません。
ウェズリーマーチ2011

2
当時、私はそれをテストしました。
kzh

3
私の過ち、OPはChrome 10を指定し、FF5にいた。申し訳ありませんが、反対投票を削除しました。うわー、Chromeのエラーメッセージは今まで見た中で最も醜いものです。
Wesley Murch、2011

2
:Firefoxで宣言型のエラーメッセージについては属性を使用x-moz-errormessage="This field should not be left blank."
robertc

2
これにより、「このフィールドに入力してください」の下に説明メッセージが追加されます。
Magne、2013年

41

の助けを借りてカスタムメッセージを制御することは非常に簡単です HTML5 oninvalidイベントを利用

これがコードです:

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

4
コントロールが入力を受け取ったら、有効性メッセージを空白に設定する必要があります。そうしないと、最初に実行された有効性メッセージがすべてのフィールドに表示されます。setCustomValidity()を呼び出すたびに、oninput = "setCustomValidity( '')"を追加します。サムナスの答えに+1。
タラン2015

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。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たとえば、React Selectフィールドからオプションが削除された場合はnullになる可能性があります。それを確認することを忘れないでください。
GuiRitter

正誤表:これをReact Selectで使用するには、合格する必要がonChangeありonInvalidます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 2012

OPはGoogle Chromeを使用しているため、良い回答です。これはIE Edgeでは機能しません
CoderHawk '13 / 07/15

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/


hey .... niceソリューションですが、type = emailがSafariブラウザで機能しません。ルック持っw3schools.com/html/html_form_input_types.asp
Bhawnaマルホトラ

2
はい、Safariではサポートされていませんが、カスタム検証メッセージの設定に対して回答しました。
Rikin Patel

10

私が見つけた最も簡単でクリーンな方法は、データ属性を使用してカスタムエラーを格納することです。ノードの有効性をテストし、カスタム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「[」、「\」、「]」、「^」、「_」、および「 `」を許可します。
ローレンスドル2013

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

適応サラー 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

フィールドに「タイトル」を入力するだけで簡単に処理できます。

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

表示されるエラーメッセージは変わりません。ホバーしたときにのみ入力にタイトルが表示されます。
Mathieu Dumoulin

これは、入力フィールドの警告を表示する「タイトル」の正しい使用法ではありません。
サジャドサデリ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.