目的
Bootstrap4のValidation Formを使ってフォームを作成した時、ブラウザ機能によるバリデーションメッセージも表示され何だか見づらい・・・
is-invalid
クラスをJavascript(jQuery)で動的に制御してBootstrapのバリデーションメッセージだけを表示させてスッキリさせたい。
実際に作りたい画面
下のようなinput
とtextarea
の混ざったシンプルなフォーム。Bootstrapのバリデーションメッセージのみを表示させたい。
実装
HTML
<!-- novalidateでブラウザのバリデーション機能を無効にする --><formaction="javascript:void(0)"novalidate="novalidate"><divclass="form-row"><divclass="col-md-4 mb-3"><labelfor="validationServer01">First name</label><inputtype="text"class="form-control"id="validationServer01"placeholder="First name"><divclass="invalid-feedback">
Please provide a First name.
</div></div><divclass="col-md-4 mb-3"><labelfor="validationServer02">Last name</label><inputtype="text"class="form-control"id="validationServer02"placeholder="Last name"><divclass="invalid-feedback">
Please provide a Last name.
</div></div><divclass="col-md-4 mb-3"><labelfor="validationServerUsername">Username</label><divclass="input-group"><divclass="input-group-prepend"><spanclass="input-group-text"id="inputGroupPrepend3">@</span></div><inputtype="text"class="form-control"id="validationServerUsername"placeholder="Username"aria-describedby="inputGroupPrepend3"><divclass="invalid-feedback">
Please choose a username.
</div></div></div></div><divclass="form-row"><divclass="col-md-6 mb-3"><labelfor="validationServer03">City</label><textareatype="text"class="form-control"id="validationServer03"placeholder="City"></textarea><divclass="invalid-feedback">
Please provide a valid city.
</div></div><divclass="col-md-3 mb-3"><labelfor="validationServer04">State</label><inputtype="text"class="form-control"id="validationServer04"placeholder="State"><divclass="invalid-feedback">
Please provide a valid state.
</div></div><divclass="col-md-3 mb-3"><labelfor="validationServer05">Zip</label><inputtype="text"class="form-control"id="validationServer05"placeholder="Zip"><divclass="invalid-feedback">
Please provide a valid zip.
</div></div></div><buttonclass="btn btn-primary"type="submit">Submit form</button></form>
JS
$('form').on('submit',(e)=>{constformContents=e.target.querySelectorAll('input.form-control, textarea.form-control')for(constindexinformContents){if(!formContents[index].value){$('#'+formContents[index].id).addClass('is-invalid')}else{$('#'+formContents[index].id).removeClass('is-invalid')}}})
ブラウザのバリデーションメッセージをカスタムする方法もあるようですが、今回はBootstrapにこだわりました。。
これでバリデーションエラーがBootstrap一律になって見やすくなった!!!