<div class="utility-07 p-2" id="js-utility-07">
<!-- 名前(必須、全角判定、文字数制限)-->
<div class="field" id="js-utility-07-name"><label class="label">名前</label>
<div class="control"><input class="js-utility-07-input input" type="text" placeholder="山田 太郎" /></div>
<p class="js-utility-07-success help is-hidden is-success">正しく入力されています。</p>
<p class="js-utility-07-danger help is-hidden is-danger"></p>
</div><!-- ヨミガナ(必須、全角カタカナ判定、文字数制限)-->
<div class="field" id="js-utility-07-yomigana"><label class="label">ヨミガナ</label>
<div class="control"><input class="js-utility-07-input input" type="text" placeholder="ヤマダ タロウ" /></div>
<p class="js-utility-07-success help is-hidden is-success">正しく入力されています。</p>
<p class="js-utility-07-danger help is-hidden is-danger"></p>
</div><!-- メールアドレス(必須、メール書式判定)-->
<div class="field" id="js-utility-07-mail"><label class="label">メールアドレス</label>
<div class="control"><input class="js-utility-07-input input" type="email" placeholder="sample@mail.com" /></div>
<p class="js-utility-07-success help is-hidden is-success">正しく入力されています。</p>
<p class="js-utility-07-danger help is-hidden is-danger"></p>
</div><!-- お問い合わせ内容(文字数制限)-->
<div class="field" id="js-utility-07-contact"><label class="label">お問い合わせ内容</label>
<div class="control"><textarea class="js-utility-07-input textarea" placeholder="例:利用料金の内容について など"></textarea></div>
<p class="js-utility-07-success help is-hidden is-success">正しく入力されています。</p>
<p class="js-utility-07-danger help is-hidden is-danger"></p>
<p class="help has-text-right"><span id="js-utility-07-contact-current"></span>/<span id="js-utility-07-contact-max"></span></p>
</div>
</div>
#js-utility-07.utility-07.p-2
// 名前(必須、全角判定、文字数制限)
.field#js-utility-07-name
label.label 名前
.control
input.js-utility-07-input.input(type='text', placeholder='山田 太郎')
p.js-utility-07-success.help.is-hidden.is-success 正しく入力されています。
p.js-utility-07-danger.help.is-hidden.is-danger
// ヨミガナ(必須、全角カタカナ判定、文字数制限)
.field#js-utility-07-yomigana
label.label ヨミガナ
.control
input.js-utility-07-input.input(type='text', placeholder='ヤマダ タロウ')
p.js-utility-07-success.help.is-hidden.is-success 正しく入力されています。
p.js-utility-07-danger.help.is-hidden.is-danger
// メールアドレス(必須、メール書式判定)
.field#js-utility-07-mail
label.label メールアドレス
.control
input.js-utility-07-input.input(type='email', placeholder='sample@mail.com')
p.js-utility-07-success.help.is-hidden.is-success 正しく入力されています。
p.js-utility-07-danger.help.is-hidden.is-danger
// お問い合わせ内容(文字数制限)
.field#js-utility-07-contact
label.label お問い合わせ内容
.control
textarea.js-utility-07-input.textarea(placeholder='例:利用料金の内容について など')
p.js-utility-07-success.help.is-hidden.is-success 正しく入力されています。
p.js-utility-07-danger.help.is-hidden.is-danger
p.help.has-text-right
span#js-utility-07-contact-current
| /
span#js-utility-07-contact-max
/* No context defined. */
$BLOCK_NAME: '.utility-07';
// 変数
#{ $BLOCK_NAME } {
//
}
'use strict';
export const utility07 = () => {
const utility = new Utility07();
utility.init();
}
type Validation = {
id: string,
message: string,
};
class Utility07 {
el: HTMLElement;
nameEl: HTMLElement;
yomiganaEl: HTMLElement;
mailEl: HTMLElement;
contactEl: HTMLElement;
constructor() {
this.el = document.getElementById('js-utility-07');
this.nameEl = document.getElementById('js-utility-07-name');
this.yomiganaEl = document.getElementById('js-utility-07-yomigana');
this.mailEl = document.getElementById('js-utility-07-mail');
this.contactEl = document.getElementById('js-utility-07-contact');
}
/**
* 初期化
*/
init(): void {
if (!this.el) return;
this.onInputName();
this.onInputYomigana();
this.onInputMail();
this.onInputContact();
}
/**
* フォームのスタイル設定
* @param el 対象のHTML要素
* @param style 設定するスタイル
*/
setFormStyle(el: HTMLElement, style: string) {
const inputEl = el.getElementsByClassName('js-utility-07-input')[0];
const successEl = el.getElementsByClassName('js-utility-07-success')[0];
const dangerEl = el.getElementsByClassName('js-utility-07-danger')[0];
if (style === 'success') {
inputEl.classList.remove('is-danger');
inputEl.classList.add('is-success');
successEl.classList.remove('is-hidden');
dangerEl.classList.add('is-hidden');
}
if (style === 'danger') {
inputEl.classList.remove('is-success');
inputEl.classList.add('is-danger');
successEl.classList.add('is-hidden');
dangerEl.classList.remove('is-hidden');
}
}
/**
* 名前フォーム入力時のイベント設定
*/
onInputName() {
if (!this.nameEl) return;
this.nameEl.addEventListener('input', e => {
const target = <HTMLInputElement>e.target;
const targetVal = target.value;
const validationResults = this.getValidationResults(
targetVal,
['required', 'zenkaku'],
20
);
const dangerEl = this.nameEl.getElementsByClassName('js-utility-07-danger')[0];
if (validationResults.length) {
// 入力内容に問題がある場合
const messages = validationResults.map(result => {
return result.message;
});
dangerEl.innerHTML = messages.join('<br>');
this.setFormStyle(this.nameEl, 'danger');
} else {
// 入力内容に問題がない場合
dangerEl.innerHTML = '';
this.setFormStyle(this.nameEl, 'success');
}
});
}
/**
* ヨミガナフォーム入力時のイベント設定
*/
onInputYomigana() {
if (!this.yomiganaEl) return;
this.yomiganaEl.addEventListener('input', e => {
const target = <HTMLInputElement>e.target;
const targetVal = target.value;
const validationResults = this.getValidationResults(
targetVal,
['required', 'zenkana'],
20
);
const dangerEl = this.yomiganaEl.getElementsByClassName('js-utility-07-danger')[0];
if (validationResults.length) {
// 入力内容に問題がある場合
const messages = validationResults.map(result => {
return result.message;
});
dangerEl.innerHTML = messages.join('<br>');
this.setFormStyle(this.yomiganaEl, 'danger');
} else {
// 入力内容に問題がない場合
dangerEl.innerHTML = '';
this.setFormStyle(this.yomiganaEl, 'success');
}
});
}
/**
* メールフォーム入力時のイベント設定
*/
onInputMail() {
if (!this.mailEl) return;
this.mailEl.addEventListener('input', e => {
const target = <HTMLInputElement>e.target;
const targetVal = target.value;
const validationResults = this.getValidationResults(
targetVal,
['required', 'mail']
);
const dangerEl = this.mailEl.getElementsByClassName('js-utility-07-danger')[0];
if (validationResults.length) {
// 入力内容に問題がある場合
const messages = validationResults.map(result => {
return result.message;
});
dangerEl.innerHTML = messages.join('<br>');
this.setFormStyle(this.mailEl, 'danger');
} else {
// 入力内容に問題がない場合
dangerEl.innerHTML = '';
this.setFormStyle(this.mailEl, 'success');
}
});
}
/**
* お問い合わせ内容フォーム入力時のイベント設定
*/
onInputContact() {
if (!this.contactEl) return;
// 入力文字数の初期表示
const maxLength = 100;
const currentEl = document.getElementById('js-utility-07-contact-current');
const maxEl = document.getElementById('js-utility-07-contact-max');
currentEl.textContent = '0';
maxEl.textContent = maxLength.toString();
// 入力イベント設定
this.contactEl.addEventListener('input', e => {
const target = <HTMLInputElement>e.target;
const targetVal = target.value;
// 入力文字数の更新
currentEl.textContent = targetVal.length.toString();
const validationResults = this.getValidationResults(
targetVal,
[],
maxLength
);
const dangerEl = this.contactEl.getElementsByClassName('js-utility-07-danger')[0];
if (validationResults.length) {
// 入力内容に問題がある場合
const messages = validationResults.map(result => {
return result.message;
});
dangerEl.innerHTML = messages.join('<br>');
this.setFormStyle(this.contactEl, 'danger');
} else {
// 入力内容に問題がない場合
dangerEl.innerHTML = '';
this.setFormStyle(this.contactEl, 'success');
}
});
}
/**
* 文字列のバリデーション結果取得
* @param text バリデーションする文字列
* @param maxLength 最大文字数(任意入力)
* @returns バリデーション結果
*/
getValidationResults(text: string, checkTypes: string[], maxLength: number = null): Validation[] {
const result = new Array;
// 入力されているか判定
if (
checkTypes.indexOf('required') !== -1 &&
!text
) {
result.push({
id: 'required',
message: '入力必須項目です。',
});
}
// 最大文字数以内か判定
if (
maxLength &&
text.length > maxLength
) {
result.push({
id: 'maxLength',
message: `${maxLength}文字以内で入力してください。`,
});
}
// 全角か判定
if (
checkTypes.indexOf('zenkaku') !== -1 &&
text &&
!text.match(/^[^\x01-\x7E\xA1-\xDF]+$/)
) {
result.push({
id: 'zenkaku',
message: '全角文字で入力してください。',
});
}
// 全角カタカナか判定
if (
checkTypes.indexOf('zenkana') !== -1 &&
text &&
!text.match(/^[ァ-ヶー ]+$/)
) {
result.push({
id: 'zenkana',
message: '全角カタカナで入力してください。',
});
}
// メールアドレスの書式か判定
if (
checkTypes.indexOf('mail') !== -1 &&
text &&
!text.match(/^[A-Za-z0-9]{1}[A-Za-z0-9_.-]*@{1}[A-Za-z0-9_.-]{1,}.[A-Za-z0-9]{1,}$/)
) {
result.push({
id: 'mail',
message: 'メールアドレスを入力してください。',
});
}
return result;
}
}
フォーム入力時にバリデーションを行うスクリプト。