🐥

【JavaScript】jQueryで実装していたコードをVanilla JSに書き換え

2024/10/17に公開

やること

Enterキーを押したときに次の入力フィールドに自動的にフォーカスを移動させる機能を実装しています。
jQueryで実装しているものをVanila JSに書き直してみます。

jQuery

$(":input").on("keydown", function (event) {
    if (event.which === 13 && !$(this).is("textarea, :button, :submit")) {
        event.stopPropagation();
        event.preventDefault();

        $(this)
            .nextAll(":input:not(:disabled, [readonly='readonly'])")
            .first()
            .focus();
    }
});

Vanilla JS

document.addEventListener('keydown', function(event) {
    if (event.target.matches('input, select, textarea')) {
        if (event.key === 'Enter' && 
            !event.target.matches('textarea, button, input[type="submit"], input[type="button"]')) {
            event.stopPropagation();
            event.preventDefault();

            let currentElement = event.target.nextElementSibling;
            let nextInput = null;

            while (currentElement !== null) {
                if (currentElement.matches('input, select, textarea') && 
                    !currentElement.disabled && 
                    currentElement.getAttribute('readonly') !== 'readonly') {
                    nextInput = currentElement;
                    break;
                }
                currentElement = currentElement.nextElementSibling;
            }

            if (nextInput) {
                nextInput.focus();
            }
        }
    }
});

実装

  • イベントリスナーの設定
document.addEventListener('keydown', function(event) {
    // ... (イベントハンドラの中身)
})

この条件文は、キーが押されたターゲット要素が入力フィールド(input, select, textarea)であるかどうかをチェックします。

  • 入力要素の確認
if (event.target.matches('input, select, textarea')) {
    // ... (条件に合致した場合の処理)
}

この条件文は、キーが押されたターゲット要素が入力フィールド(input, select, textarea)であるかどうかをチェックします。

  • Enterキーの処理
if (event.key === 'Enter' && 
    !event.target.matches('textarea, button, input[type="submit"], input[type="button"]')) {
    // ... (Enterキーが押された場合の処理)
}

この条件文は、押されたキーがEnterキーであり、かつターゲット要素がテキストエリア、ボタン、送信ボタン、通常のボタンでないことを確認します。

  • イベントの停止
event.stopPropagation();
event.preventDefault();

これらの行は、イベントの伝播を停止し、デフォルトの動作(例:フォームの送信)を防ぎます。

  • 次の入力要素の検索
let currentElement = event.target.nextElementSibling;
let nextInput = null;

while (currentElement !== null) {
    if (currentElement.matches('input, select, textarea') && 
        !currentElement.disabled && 
        currentElement.getAttribute('readonly') !== 'readonly') {
        nextInput = currentElement;
        break;
    }
    currentElement = currentElement.nextElementSibling;
}

このループは、現在の要素の次の兄弟要素を順に調べ、有効な入力フィールドを見つけます。見つかった場合、その要素をnextInputに設定します

  • フォーカスの移動
if (nextInput) {
    nextInput.focus();
}

次の入力要素が見つかった場合、その要素にフォーカスを移動させます。

まとめ

jQueryの抽象度が高いのがわかる。もう少しVanila JS頑張ってみよう。

株式会社ジード テックブログ

Discussion