Web アプリに、ユーザーが URL を入力する必要があるフォームがあります。今のところ、url 入力の検証をサーバーに任せることにしましたが、モバイル デバイスの入力に HTML5 url タイプを使用する利点を保持したいと考えました。
ここに私のフォームコードがあります:
<form method="post" action="." required novalidate>{% csrf_token %}
<fieldset>
<legend>{% trans "Add Resource Link" %}</legend>
<div class="well">
<label for="id_url"><strong>{% trans "Web Address" %}</strong></label>
{% if form.url.errors %}
<div class="alert alert-error">{{ form.url.errors }}</div>
{% endif %}
<div class="input-prepend">
<span class="add-on"><i class="icon-link"></i></span>
<input id="id_url" name="url" type="url" placeholder="http://www.example.com">
</div>
<div>
<button type="submit" class="btn btn-primary">{% trans "Add Link" %}</button>
</div>
</div>
</fieldset>
</form>
フォームで novalidate を使用すると、サーバー検証によってキャッチされた無効な URL を送信できますが、input:focus:invalid:focus は引き続きトリガーされ、1 つ以上の文字である URL に対してデフォルトの HTML5 正規表現検証を使用しているように見えます。コロンが続きます。
入力のないフォームのスクリーン キャプチャ:
無効な入力を含むフォームのスクリーン キャプチャ:
HTML5 での URL 検証のデフォルトの正規表現による有効な入力を含むフォームのスクリーン キャプチャ (だと思いますか?):
私の質問は、novalidate が使用されているときに input:focus:invalid:focus がトリガーされるのはなぜですか? これは、私が理解していない予想される動作である可能性があると思います.. input:focus:invalid:focus がトリガーされないようにするための推奨されるベストプラクティスは何ですか - つまり、クライアント側で入力検証を行いたくない - で少なくとも現時点ではありません。Chrome バージョン 25.0.1364.172 を使用して Linux (Ubuntu 12.04) でテストしています。