【jQuery】blur()でフォーカスが外れた瞬間に処理を実行する方法|バリデーション実装まで

【jQuery】blur()でフォーカスが外れた瞬間に処理を実行する jQuery

jQueryの blur() はフォーム入力フィールドからフォーカスが離れたときに発火するイベントです。ユーザーがフィールドを入力して次に移動した瞬間にバリデーションを実行するなど、リアルタイムバリデーションUIの実装に必須の機能です。

この記事でわかること

  • blur()の基本構文と発火タイミング
  • フォーカスイベント(focus・blur・focusin・focusout)の違い
  • blurを使ったリアルタイムバリデーション実装
  • on(“blur”)とblur()の違い
  • バニラJSとの対応関係
スポンサーリンク

1. blur()の基本構文

blur() はフォーカスが外れたときに実行するハンドラーを設定します。focus() と対になるイベントです。

// ハンドラーを設定(入力欄からフォーカスが外れたら実行)
$('#input-name').on('blur', function () {
  console.log('フォーカスが外れました');
  console.log('入力値:', $(this).val());
});

// 短縮形(blur()メソッドに関数を渡す)
$('#input-name').blur(function () {
  // blurイベントのハンドラー
});

// 引数なしでblur()を呼ぶと、プログラムからblurイベントを発火できる
$('#input-name').blur();  // 手動でフォーカスを外す

2. フォーカスイベントの種類と違い

イベント 発火タイミング バブリング
focus フォーカスが当たった瞬間 なし
blur フォーカスが外れた瞬間 なし
focusin フォーカスが当たった瞬間 あり(親要素で検知可)
focusout フォーカスが外れた瞬間 あり(親要素で検知可)
フォームの親要素で全フィールドを一括監視するにはfocusout
blur はバブリングしないため、$('form').on('blur', 'input', ...) のようなイベント委任では機能しません。委任する場合は focusout を使ってください。

3. リアルタイムバリデーションの実装

フィールドを離れたタイミングでバリデーションを実行し、エラーメッセージを表示する定番パターンです。

<div class="form-group">
  <label for="email">メールアドレス</label>
  <input type="email" id="email" name="email">
  <span class="error-msg" style="display:none;color:red;"></span>
</div>
$(function () {
  $('#email').on('blur', function () {
    var val     = $(this).val();
    var $error  = $(this).siblings('.error-msg');
    var pattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;

    if (val === '') {
      $error.text('メールアドレスを入力してください').show();
      $(this).addClass('is-error');
    } else if (!pattern.test(val)) {
      $error.text('正しいメールアドレスを入力してください').show();
      $(this).addClass('is-error');
    } else {
      $error.hide();
      $(this).removeClass('is-error').addClass('is-valid');
    }
  });

  // 入力中はエラー表示をクリア
  $('#email').on('focus', function () {
    $(this).siblings('.error-msg').hide();
    $(this).removeClass('is-error is-valid');
  });
});
input.is-error  { border: 2px solid #ef4444; }
input.is-valid  { border: 2px solid #22c55e; }
.error-msg      { font-size: 0.85em; margin-top: 4px; }

4. 複数フィールドをまとめてバリデーション

フォーム全体の必須フィールドを一括管理する実用的なパターンです。

$(function () {
  // 必須フィールドに blur を一括設定
  $('input[required], textarea[required]').on('blur', function () {
    validateField($(this));
  });

  function validateField($field) {
    var val    = $field.val().trim();
    var $error = $field.next('.error-msg');

    if (val === '') {
      $error.text('この項目は必須です').show();
      $field.addClass('is-error');
      return false;
    }
    $error.hide();
    $field.removeClass('is-error');
    return true;
  }

  // 送信前に全フィールドを検証
  $('form').on('submit', function (e) {
    var isValid = true;
    $('input[required], textarea[required]').each(function () {
      if (!validateField($(this))) isValid = false;
    });
    if (!isValid) e.preventDefault();
  });
});

5. focusとblurを組み合わせてUIを改善

$(function () {
  // フォーカス時に親要素にクラスを追加してスタイルを変える
  $('input, textarea').on('focus', function () {
    $(this).closest('.form-group').addClass('is-focused');
  }).on('blur', function () {
    $(this).closest('.form-group').removeClass('is-focused');
  });

  // フォーカス時にplaceholderを消す(古いブラウザ対応)
  $('input[placeholder]').on('focus', function () {
    $(this).data('placeholder', $(this).attr('placeholder'));
    $(this).attr('placeholder', '');
  }).on('blur', function () {
    $(this).attr('placeholder', $(this).data('placeholder'));
  });
});

6. バニラJSとの対応

// バニラJS
document.getElementById('email').addEventListener('blur', function () {
  console.log('blur:', this.value);
});

// focusout は親要素から委任できる
document.getElementById('form').addEventListener('focusout', function (e) {
  if (e.target.tagName === 'INPUT') {
    validateField(e.target);
  }
});

まとめ

jQueryの blur() はフォームフィールドからフォーカスが外れたタイミングでリアルタイムバリデーションを実行するのに最適なイベントです。イベント委任が必要な場合は focusout を使い、フォーカス取得は focus() と組み合わせてUIを改善しましょう。

関連記事: jQueryで入力フォームバリデーションを実装する方法 / jQueryのhover()でマウスオーバー時に処理を実行する方法

よくある質問(FAQ)

Qblur()とfocusout()の違いは何ですか?
Aどちらもフォーカスが外れたときに発火しますが、focusout はバブリングします。親要素でイベント委任($(parent).on("focusout", "input", ...))したい場合は focusout を使ってください。blur はバブリングしないため委任では使えません。
Qフォームを離れた瞬間にバリデーションするには?
Ablur イベントでバリデーション関数を呼び出すのが定番パターンです。値が空なら addClass("is-error") でエラー表示クラスを付与し、正しければ addClass("is-valid") を付与するUIが一般的です。
Q引数なしのblur()は何をしますか?
A引数なしで $(selector).blur() を呼ぶと、プログラムからblurイベントを手動発火させます。フォームをリセットしたときに全フィールドのblurを強制実行する用途などに使えます。
Q複数のフィールドにまとめてblurを設定するには?
A$("input[required]").on("blur", function(){ ... }) のように複数セレクタにまとめて設定できます。各フィールドで $(this) を使えばそれぞれのフィールドへの参照が取得できます。
Qfocus時とblur時で別々の処理をしたい
A.on("focus", handler).on("blur", handler) でメソッドチェーンして別々に設定できます。同一セレクタに両方設定することで、フォーカス→入力→フォーカス離脱のフローを細かく制御できます。