LoginSignup
53
49

More than 5 years have passed since last update.

HTML5なら外部ライブラリを利用しないでリアルタイム入力チェック出来る

Last updated at Posted at 2014-01-25

WEB


HTML5
使

コード

<section>
    <form id="sampleForm">
        <label>
            半角英数字以外を入力してみよう
            <input
                type="text" id="input" placeholder="半角英数字で入力"
                pattern="^[0-9A-Za-z]+$" required>
        </label>
        <button type="submit" id="submit">送信</button>
    </form>
</section>

<script>
"use strict";
var form   = document.getElementById("sampleForm"),
    input  = document.getElementById("input"),
    submit = document.getElementById("submit");

input.addEventListener("input", function() {
    if (!input.value) {
        input.setCustomValidity("");
        submit.click();
        return;
    } else if (false === form.checkValidity()) {
        input.setCustomValidity("半角英数字以外の値が入力されました。");
        submit.click();
        return;
    }
    input.setCustomValidity("");
});
</script>

何をしているか?

  • inputボックスに入力があるたびに、formの妥当性をform.checkValidity()を見て検証
  • 検証結果がfalseだったらformをsubmitしてブラウザのバリデーションを実行
  • setCustomValidityを利用して独自のメッセージを設定

ちょっとハマった


formsubmitform.submit()
Uncaught TypeError: Property 'submit' of object #<HTMLFormElement> is not a function
chrome

formsubmitbuttonformsubmit
submitform.submit()HTML5

submitsubmit.click()submit


HTML5submitclick




HTML5



実用を考えたコード

<meta charset="utf8">

<section>
    <form id="sampleForm">
        <label>
            半角英数字以外を入力してみよう
            <input
                type="text" class="validate" id="input" placeholder="半角英数字で入力"
                pattern="^[0-9A-Za-z]+$" required data-validity-msg="半角英数字のみで入力して下さい。">
        </label><br>
        <label>
            メールアドレスしかダメです
            <input
                type="email" class="validate" id="email" placeholder="メールアドレスを入力"
                required data-validity-msg="メールアドレスの形式で入力して下さい。">
        </label><br>
        <button type="submit" id="submit">送信</button>
    </form>
</section>
<script src="html5_validation.js">
html5_valisation.js
(function() {"use strict";
/**
 * インプットボックスにvalidateイベントを設定
 */
function setValidate(e) {
    var input = e.target;

    // インプットボック全てにdisabled属性を付与後、
    // イベントのあった要素のdisabled属性を削除してvalidate対象を限定する
    elementsToAttribute(input_boxes, "disabled", "", function() {
        input.removeAttribute("disabled");
        input.setCustomValidity("");

        if (true === input.hasAttribute("required") && !input.value) {
            submit.click();
        } else if (false === input.checkValidity()) {
            input.setCustomValidity(input.getAttribute("data-validity-msg"));
            submit.click();
        }

        elementsOutAttribute(input_boxes, "disabled");
    });
}

/**
 * 要素のリスト全てに属性を追加する
 */
function elementsToAttribute(elements, attr, val, cb) {
    for (var i=0; i<elements.length; ++i) {
        elements[i].setAttribute(attr, val);
    }
    if (cb) cb();
}

/**
 * 要素のリスト全から属性を削除する
 */
function elementsOutAttribute(elements, attr, cb) {
    for (var i=0; i<elements.length; ++i) {
        elements[i].removeAttribute(attr);
    }
    if (cb) cb();
}

var submit      = document.getElementById("submit"),
    input_boxes = document.querySelectorAll(".validate");

for (var i=0; i<input_boxes.length; ++i) {
    try {
        input_boxes[i].addEventListener("input", setValidate);
    } catch (e) {
        console.log(e);
    }
}
// end proc.
})();



validitydata-validity-msg

validateformdisableddisabled


minmaxmaxlength

53
49
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

53
49