HTML5フォーム要素の検証を無効にする


418

私のフォームでは、たとえば新しいHTML5フォームタイプを使用したいと思います<input type="url" />タイプの詳細はこちら)。

問題は、Chromeが非常に役に立って、私にとってこれらの要素を検証したいということです。組み込みの検証に失敗した場合、要素がフォーカスを取得する以外にメッセージや指示はありません。私はURL要素にを事前に入力している"http://"ため、独自のカスタム検証ではこれらの値を空の文字列として扱うだけですが、Chromeでは拒否されます。検証ルールを変更できれば、それも機能します。

私は使用に戻すことができることはわかってtype="text"いますが、これらの新しいタイプのオファーを使用して素晴らしい拡張が必要です(例:モバイルデバイスのカスタムキーボードレイアウトに自動的に切り替わります):

それで、自動検証をオフにするか、カスタマイズする方法はありますか?


8
HTML 5.1ドラフト仕様は言及inputmode属性私が正しく読んだものを理解していた場合- - 、ときそれらが相互作用場でキーボードタイプは、利用者に提供すべきかを指定するために使用することができなくても、任意の検証ルールを暗示しています。将来のある時点で、inputmode属性の代わりに属性を使用することは、typeおそらくこの問題の正しい解決策になりますが、まだではありません。
Mark Amery

@MarkAmery今の未来を手に入れるのはそれほど難しくはないでしょうが$('[inputmode]').each(function () { this.attr({type: this.attr('inputmode'), novalidate: true}) });
Marnen Laibow-Koser

1
@ MarnenLaibow-Koserこれまでに説明したことは、(質問の質問者が指定したように)検証をオフにするだけで機能する場合は機能しますが、実際の結果と同じになるわけではありませんinputmode。あなたのやり方でやっていても、(たとえば)ユーザーがtypeの入力ボックスに入力した数値以外の値を読み取ることはできませんnumber。たとえば、このフィドルのテキストボックスに数値以外の何かを入力して、ボタンをクリックしてみてください。
マークアメリー2014

@MarkAmery興味深い。それは<input type='number'>数値以外の値をまったく受け入れないためですか?
Marnen Laibow-Koser 2014

@ MarnenLaibow-Koserそうですね。この問題に関するこの質問に対する受け入れられた回答には、回答者がこの動作を義務付けていると主張する仕様へのリンクが含まれています。
マークアメリー2014

回答:


752

HTML5のフォームのクライアント側の検証を無効にする場合は、フォーム要素にnovalidate属性を追加します。例:

<form method="post" action="/foo" novalidate>...</form>

https://www.w3.org/TR/html5/sec-forms.html#element-attrdef-form-novalidateを参照してください


83
novalidate="novalidate"そしてnovalidate=""、あまりにも、有効な構文です。
Basim

9
@bassim構文は有効ですが、冗長すぎます。必要以上に入力してください。
user1569050 2013年

11
@ user1569050たとえば、CakePHPのようなフレームワークでは、の配列novalidate="novalidate"にを設定するとメソッドが使用されます。追加情報を提供してくれたbassimに感謝します:)novalidate => true$optionsFormHelper::create()
Jelmer

12
@ rybo111これはクライアント側の検証であり、サーバーへのリクエスト数を減らすのに適しています。サーバー側での検証を容易にする言い訳にはなりません。
martti 14

11
@martti私はいくつかの新しいPHP検証をテストしている場合、フォーム全体を正しく入力する必要がないように、その1つのフォームのJavaScript検証をすぐに無効にできるという事実を言及していました。「テストしやすい」と書いておくべきだった。
rybo111 14

31

私は仕様を読み、Chromeでいくつかのテストを行いました。「無効な」イベントをキャッチしてfalseを返すと、フォームを送信できるようです。

このHTMLでjqueryを使用しています。

// suppress "invalid" events on URL inputs
$('input[type="url"]').bind('invalid', function() {
  alert('invalid');
  return false;
});

document.forms[0].onsubmit = function () {
  alert('form submitted');
};
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form>
  <input type="url" value="http://" />
  <button type="submit">Submit</button>
</form>

他のブラウザではこれをテストしていません。


すばらしい-明日試してみて、どうなるか教えてあげる。ありがとう。
nickf

うわー!私は自分の送信イベントがどこに行ったのかを探すのに本当に苦労していました。ありがとうございます!
ジプシーキング

2
FireFoxは入力の変更を検証しています。その後、「無効な」イベントは発生しません。だから、私には解決策はありません。
Niels Steenbeek

7
明日は決して来ない:)
Lucky Soni 14

4
動作しません。コードをスニペットにしました。invalidイベントをキャッチしてfalseを返すと、フォームが送信されません。
Dan Dascalescu、2015

23

フォームでnovalidate属性を使用すると、ブラウザがフォームを送信できなくなるだけであることを追加したいと思います。ブラウザは引き続きデータを評価し、:validおよび:invalid疑似クラスを追加します。

これがわかったのは、有効な疑似クラスと無効な疑似クラスが、私が使用していたHTML5ボイラープレートスタイルシートの一部だからです。擬似クラスに関連するCSSファイルのエントリを削除しました。誰か他の解決策を見つけた場合はお知らせください。


エントリーは何と呼ばれましたか?
tm_forthefuture 14

1
ははは〜すみません。これは3年前のことです。:(
BFTrick 14

1
あなたは意味:<form action="" method="" class="" id="" novalidate>;)
ムハンマドShahzad

15

最良の解決策は、テキスト入力を使用し、inputmode = "url"属性を追加して、URLキーボード機能を提供することです。HTML5仕様はこの目的のために考えられました。type = "url"を維持すると、すべての場合に役立つわけではない構文検証が得られます(非常に寛容であり、あまり役に立たない構文ではなく、404エラーを返すかどうかを確認することをお勧めします)。

また、たとえばより寛容になるように、属性pattern = "https?://.+"でデフォルトのパターンを上書きする可能性もあります。

フォームにnovalidate属性を指定すると、フォームのすべてのフィールドの検証が削除され、たとえばメールフィールドの検証を維持したい場合があるため、質問に対する正しい回答ではありません。

jQueryを使用して検証を無効にすることも、JavaScriptなしで完全に機能するため、不適切なソリューションです。

私の場合、URL入力の前に2つのオプション(http://またはhttps://)を含むselect要素を配置します。これは、Webサイトのみが必要なためです(ftp://などは不要)。このようにして、この奇妙なプレフィックス(Tim Berners-Leeの最大の後悔であり、URL構文エラーの主な原因である可能性があります)を入力することを避け、プレースホルダー(HTTPなし)を使用した単純なテキスト入力とinputmode = "url"を使用します。jQueryとサーバー側スクリプトを使用して、Webサイトの実際の存在(404なし)を検証し、挿入されている場合はHTTPプレフィックスを削除します(pattern = "^((?http)。)* $"のようなパターンの使用は避けますより寛容である方が良いと思うので、接頭辞を付けるのを防ぐため)


13

ブラウザの検証を回避するためにエンドランを実行する代わりhttp://に、プレースホルダテキストとしてを配置できます。これはあなたがリンクしたページそのものです:

プレースホルダーテキスト

HTML5がWebフォームにもたらす最初の改善は、入力フィールドにプレースホルダーテキストを設定する機能ですです。プレースホルダーテキストは、フィールドが空でフォーカスされていない限り、入力フィールド内に表示されます。入力フィールドをクリック(またはタブ移動)するとすぐに、プレースホルダーのテキストが消えます。

以前にプレースホルダーテキストを見たことがあるでしょう。たとえば、Mozilla Firefox 3.5では、ロケーションバーに「ブックマークと履歴の検索」というプレースホルダーテキストが含まれるようになりました。

ここに画像の説明を入力してください

ロケーションバーをクリック(またはタブで移動)すると、プレースホルダーテキストが非表示になります。

ここに画像の説明を入力してください

皮肉なことに、Firefox 3.5は独自のWebフォームへのプレースホルダーテキストの追加をサポートしていません。C'est la vie。

プレースホルダーのサポート

IE  FIREFOX SAFARI  CHROME  OPERA   IPHONE  ANDROID
·   3.7+    4.0+    4.0+    ·       ·       ·

独自のWebフォームにプレースホルダーテキストを含める方法は次のとおりです。

<form>
  <input name="q" placeholder="Search Bookmarks and History">
  <input type="submit" value="Search">
</form>

placeholder属性をサポートしていないブラウザは、単にそれを無視します。害、ファウルはありません。ブラウザがプレースホルダテキストをサポートしているかどうかを確認します

ユーザーに「開始点」を提供しないため、まったく同じではありませんが、少なくとも半分はそこにあります。


5
チップの+1ですが、残念ながら私には解決策にはなりません。私はまだ検証を行いたくありません。それは主に、そのUXが非常に貧弱だからです。
nickf

10

私は、CSSを備えたChromeのソリューションを見つけました。これは、非常に便利なネイティブ検証フォームをバイパスせずに、この次のセレクターです。

form input::-webkit-validation-bubble-message, 
form select::-webkit-validation-bubble-message,
form textarea::-webkit-validation-bubble-message {
    display:none;
} 

このようにして、メッセージをカスタマイズすることもできます...

私はこのページで解決策を得ました:http : //trac.webkit.org/wiki/Styling%20Form%20Controls


1
これは
Chromeの最新

5

フォームでnovalidateを使用するだけです。

<form name="myForm" role="form" novalidate class="form-horizontal" ng-hide="formMain">

乾杯!!!


1
単一の入力タグの検証を無効にするのはどうですか?
Tobias Kolb

0

以下は、novalidateを使用している場合でも、chromeとoperaが無効な入力ダイアログを表示しないようにするために使用する関数です。

window.submittingForm = false;
$('input[novalidate]').bind('invalid', function(e) {
    if(!window.submittingForm){
        window.submittingForm = true;
        $(e.target.form).submit();
        setTimeout(function(){window.submittingForm = false;}, 100);
    }
    e.preventDefault();
    return false;
});

0

JavaScriptを追加して、これらの厄介な検証バブルを抑制し、独自のバリデーターを追加できます。

document.addEventListener('invalid', (function(){
    return function(e) {
      //prevent the browser from showing default error bubble / hint
      e.preventDefault();
      // optionally fire off some custom validation handler
      // myValidation();
    };
})(), true);


-5

シンプルなChrome拡張機能をインストールして、その場で検証を無効にするだけです https://chrome.google.com/webstore/detail/html5-form-validation-err/dcpagcgkpeflhhampddilklcnjdjlmlb/related

デフォルトではすべてがデフォルトとして機能しますが、ツールバーの拡張アイコンをシングルクリックすることでhtml5検証を無効にすることができます


多くの人々がこのソリューションを嫌う理由がわからないため、実際のHTMLコードに手を加えることなく、HTML5フォームのサーバー検証をテストできます
Andrew

3
私は質問が周りに焦点を当てているので、それが嫌われていると信じて構築 HTML5フォームを、すべてのユーザーのための自動検証をオフにします。すべてのユーザーにA)Chromeを使用し、B)拡張機能をインストールしてからサイトを使用するよう依頼することは、適切な解決策ではありません。
カルマネーション
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.