■ はじめに
https://blogs.yahoo.co.jp/dk521123/37666873.htmlhttps://blogs.yahoo.co.jp/dk521123/37668489.html
の続き。 はじめ、jQuery Validation Plugin を使おうとしてたが Bootstrap4 に対応させたく、調べてたら、Parsley が見つかったのでメモ。
■ Parsley
Parsley = パセリ* JavaScript によるデータ検証ツール
特徴
* jQuery (>= 1.8) が必要 * 古いブラウザ(IE8)もサポート(es5-shimが必要) * 日本語対応もOK * MIThttps://raw.githubusercontent.com/guillaumepotier/Parsley.js/master/LICENSE
公式サイト
http://parsleyjs.org/デモ
http://parsleyjs.org/doc/examples.html
API
http://parsleyjs.org/doc/
■ サンプル
例1:Hello World
<!DOCTYPE html> <html lang="jp"> <head> <meta charset="utf-8"> <title>Demo</title> <head> <body> <div id="error-message"></div> <form id="sample-form"> <label for="sample-data">Sample data</label> <input id="sample-data-id" name="sample-data" type="text" required data-parsley-error-message="エラー" data-parsley-errors-container="#error-message"><br /> <button type="submit">Click Me!</button> </form> <script type="text/javascript" src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha256-3edrmyuQ0w65f8gfBsqowzjJe2iM6n0nKciPUp8y+7E=" crossorigin="anonymous"></script> <script type="text/javascript" src="">https://cdn.jsdelivr.net/npm/parsleyjs@2.8.1/dist/parsley.min.js"> <script type="text/javascript"> $(function () { $("#sample-form").parsley(); }); </script> </body> </html>
例2: With Bootstrap 4 and Font Awesome
<!doctype html>
<html lang="jp">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" integrity="sha384-WskhaSGFgHYWDcbwN70/dfYBj47jz9qbsMId/iRN3ewGhXQFZCSftd1LZCfmhktB" crossorigin="anonymous">
<!-- icon -->
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.2.0/css/all.css" integrity="sha384-hWVjflwFxL6sNzntih27bfxkr27PmbbK/iSvJ+a4+0owXq79v+lsFkW54bOGbiDQ" crossorigin="anonymous">
<title>Demo</title>
</head>
<body>
<div class="container">
<h1 id="title">Bootstrap4 with Parsley</h1>
<div id="result"></div>
<form id="sample-form" action="" method="post" role="form">
<div class="form-row form-group">
<div class="col-md-4 mb-3">
<label for="validationCustom01">名字</label>
<input type="text" class="form-control" id="validationCustom01" placeholder="名字" name="familyName" autocomplete="yes"
required data-parsley-errors-messages-disabled>
<div class="invalid-feedback bs-callout bs-callout-warning hidden">
<i class="fas fa-exclamation-triangle"></i> 名字を入力してください
</div>
</div>
<div class="col-md-4 mb-3">
<label for="validationCustom02">名前</label>
<input type="text" class="form-control" id="validationCustom02" placeholder="名前" name="firstName" autocomplete="yes"
required data-parsley-errors-messages-disabled>
<div class="invalid-feedback bs-callout bs-callout-warning hidden">
<i class="fas fa-exclamation-triangle"></i> 名前を入力してください
</div>
</div>
<div class="col-md-4 mb-3">
<label for="validationCustomUsername">ユーザー名</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text" id="inputGroupPrepend">@</span>
</div>
<input type="text" class="form-control" id="validationCustomUsername" name="userName" placeholder="ユーザー名"
aria-describedby="inputGroupPrepend" required data-parsley-errors-messages-disabled>
<div class="invalid-feedback bs-callout bs-callout-warning hidden">
<i class="fas fa-exclamation-triangle"></i> ユーザー名を入力してください
</div>
</div>
</div>
</div>
<div class="form-row form-group">
<div class="col-md-6 mb-3">
<label for="validationCustomDateStart">開始日</label>
<input type="date" class="form-control" id="validationCustomDateStart" name="startDate" placeholder="開始日"
required data-parsley-errors-messages-disabled>
<div class="invalid-feedback bs-callout bs-callout-warning hidden">
<i class="fas fa-exclamation-triangle"></i> 開始日を入力してください
</div>
<div id="invalidDateStartErrorMessage"></div>
</div>
<div class="col-md-6 mb-3 form-group">
<label for="validationCustomDateEnd">終了日</label>
<input type="date" class="form-control" id="validationCustomDateEnd" name="endDate" placeholder="終了日"
data-parsley-custom-end-date-validation="" data-parsley-errors-messages-disabled>
<div class="invalid-feedback bs-callout bs-callout-warning hidden">
<i class="fas fa-exclamation-triangle"></i> 開始日より未来日付は指定できません
</div>
<div id="invalidDateEndErrorMessage"></div>
</div>
</div>
<div class="form-row">
<div class="col-md-12 mb-3 form-group">
<label for="validationCustomUsername">メモ</label>
<div class="input-group">
<textarea id="validationMemo" class="form-control" name="memo" placeholder="メモ" rows="3" maxlength="200" required
required data-parsley-errors-messages-disabled></textarea>
<div class="invalid-feedback bs-callout bs-callout-warning hidden">
<i class="fas fa-exclamation-triangle"></i> メモを入力してください
</div>
<div id="invalidMemoErrorMessage"></div>
</div>
</div>
</div>
<div class="form-group">
<div class="form-check">
<input class="form-check-input" type="checkbox" value="" id="invalidCheck" name="agreement" required
required data-parsley-errors-messages-disabled>
<label class="form-check-label" for="invalidCheck">
利用規約に同意する
</label>
<div class="invalid-feedback bs-callout bs-callout-warning hidden">
<i class="fas fa-exclamation-triangle"></i> 利用規約に同意していただき、チェックを入れる必要があります
</div>
</div>
</div>
<button type="submit" class="btn btn-primary">フォームを送信</button>
</form>
</div>
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script type="text/javascript" src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
<script type="text/javascript" src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js" integrity="sha384-smHYKdLADwkXOn1EmN1qk/HfnUcbVRZyYmZ4qpPea6sjB/pTJ0euyQp0Mk8ck+5T" crossorigin="anonymous"></script>
<!-- Parsley -->
<script type="text/javascript" src="">https://cdn.jsdelivr.net/npm/parsleyjs@2.8.1/dist/parsley.min.js">
<script type="text/javascript">
$(function () {
$("#sample-form").parsley({
errorClass: 'is-invalid text-danger',
successClass: 'is-valid',
errorsContainer: function(ParsleyField) {
return ParsleyField.$element.parents('.form-group');
},
errorsWrapper: '<span class="form-text text-danger"></span>',
errorTemplate: '<span></span>',
trigger: 'change'
}).on('field:validated', function() {
var isValid = $('.parsley-error').length === 0;
$('.bs-callout-info').toggleClass('hidden', !isValid);
$('.bs-callout-warning').toggleClass('hidden', isValid);
});
});
window.Parsley.on('form:submit', function() {
$("#result").text("[OK!] Values are valid!");
return false; // Don't submit for this demo
});
window.Parsley.addValidator('customEndDateValidation', {
validateDate: function(value) {
console.log("Event Fired");
return isValidDates();
}
});
function isValidDates() {
console.log("Enter...");
var inputCustomDateEnd = document.getElementById("validationCustomDateEnd");
inputCustomDateEnd.setCustomValidity("");
var endDateValue = $("#validationCustomDateEnd").val();
if (!endDateValue) {
return true;
}
var startDate = new Date($("#validationCustomDateStart").val());
var endDate = new Date(endDateValue);
if (endDate < startDate) {
console.log("Error");
return false;
}
return true;
}
</script>
</body>
</html>
■ Parsley あれこれ
【1】 エラー結果をクリアにする
* モーダルで入力フォーム作って、エラーの後に、キャンセルして、再度、モーダル開いたら、エラーのままだったので、モーダル表示前にリセットしたい$('#sample-form').parsley().reset();
【2】 時間の検証
[[http://parsleyjs.org/doc/index.html#validators-list]]によると、formタグの Required や type="email" などは対応されており Parsley.js 側で自動的に対応されているようだが、 type="time"には対応されていないようなので、 hh:mm形式になるように時間検証を行う対応案 : inputタグのpatternを使用して正規表現で検証する
<input type="time" class="form-check-input" pattern="^(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$">
【3】 独自の検証
* 上記の「例2: With Bootstrap 4」で使用作成方法
[1] 対象の入力欄に「data-parsley-【独自の名前】」を追加(例だと「custom-end-date-validation」)
~~~~~
<input ... data-parsley-custom-end-date-validation=""
~~~~~
[2] 独自検証するイベントを追加(以下の「'customEndDateValidation'」は[1]と紐づくように)
~~~~~
window.Parsley.addValidator('customEndDateValidation', {
validateString: function(value) {
return 【判定文(true/false)】;
}
});
~~~~~
公式デモ http://parsleyjs.org/doc/examples/customvalidator.html
公式ドキュメント 「Custom Validators」
[[http://parsleyjs.org/doc/index.html#custom]]
参考文献
https://tuono034s.com/web-entry/2602/Bootstrap4 関連
https://codepen.io/weilinzung/pen/MvZPKb
https://jsfiddle.net/djibe89/tu0ap111/
http://nicesnippets.com/snippet/bootstrap-4-with-parsley-jquery-form-validation-example