ループが最後のインデックス要素の参照を割り当てるのはなぜですか?

ガード

すべてのタグにイベントリスナーを追加したいと思います。タグは、偶数がトリガーされたときにパラメーターとしてそれ自体への参照を渡します。これが私が書いた関数です:

function validateDigitsFeature()
{
    //  Add the event listeners to input tags
    //      Get the array of input tags
    var inputTags = document.getElementsByClassName('validateInput');
    var tagId;
    //      Loop through them, adding the onkeypress event listener to each one
    for (var i = 0; i < inputTags.length; i++)
    {
        //  Give each input element an id
        tagId = inputTags[i].id = 'input_id_' + i;
        inputTags[i].addEventListener('keyup', function(){isNumberOrDot(event, tagId);}, false);
    }
}

基本的に、関数は次のことを行う必要があります。

  1. 指定されたクラス名を持つすべての入力タグを配列に格納します
  2. 配列をループし、各タグにIDを追加して
  3. ハンドラーを使用してonkeyupイベントリスナーを追加しisNumberOrDot(event, tagId)ます。

問題

onkeyupイベントが追加されますが、それぞれのハンドラーは常にtagId配列の最後の要素のを参照しています。

質問

コード/ロジックの何が問題になっていますか?そして、どのようにそれを修正することができますか?

注意

確かに、この問題はループ内のJavaScriptクロージャに関連していますが、この質問にはもっと一般的な答えがありますが、使用されているイベントリスナーに固有です。より高度な開発者にとっては、この問題に一般的な解決策を適用するのは簡単かもしれません。しかし、私にとって、他の解決策はまだ完全な説明を提供しておらず、機能さえしていませんでした。

前もって感謝します。

jfriend00

実際のイベントは、forループの実行がすでに終了した後の将来のある時点で発生するため、そのインデックスは最後の値になり、関数内のローカル変数tagIdも最後の値になります。各イベントハンドラーの値を保持する、iまたはtagIdイベントハンドラーごとに一意に保持して、それぞれが独自の値にアクセスできるようにする、ある種のクロージャーを作成する必要があります。

これを行うにはいくつかの異なる方法がありますが、すべての方法で、i各イベントハンドラーの関数に値を渡す必要があります。

IIFE(即時呼び出し関数式)を使用したものは次のとおりです。

function validateDigitsFeature()
{
    //  Add the event listeners to input tags
    //      Get the array of input tags
    var inputTags = document.getElementsByClassName('validateInput');
    //      Loop through them, adding the onkeypress event listener to each one
    for (var i = 0; i < inputTags.length; i++)
    {
        //  Give each input element an id
        (function() {
            // creates a unique function context for each event handler so the
            // value of tagId is unique for each event handler
            var tagId = inputTags[i].id = 'input_id_' + i;
            inputTags[i].addEventListener('keyup', function(){isNumberOrDot(event, tagId);}, false);
        })();
    }
}

これを行うもう少し一般的な方法は、forループからクロージャーにインデックスを渡し、イベントハンドラー内でそれに基づいて計算を行うことです(どちらの方法でも正常に機能します)。

function validateDigitsFeature()
{
    //  Add the event listeners to input tags
    //      Get the array of input tags
    var inputTags = document.getElementsByClassName('validateInput');
    //      Loop through them, adding the onkeypress event listener to each one
    for (var i = 0; i < inputTags.length; i++)
    {
        //  Give each input element an id
        (function(index) {
            // passes the `for` loop index into a function closure
            // so it is uniquely preserved for each event handler
            inputTags[index].addEventListener('keyup', function(){
                isNumberOrDot(event, inputTags[index].id = 'input_id_' + index);
            }, false);
        })(i);
    }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

文字列インデックスにint(0)を割り当てると、ループが終了するのはなぜですか?

分類Dev

連想配列の最後の要素(テーブルごとのインデックス)がによって出力されないのはなぜですか?

分類Dev

Vueの配列から要素を削除するときに、最後のインデックスで遷移が発生するのはなぜですか?

分類Dev

Toastがこのループ内の最後の要素にスキップするのはなぜですか?

分類Dev

Javascript:forループを作成するときに、最後のインデックス番号を出力するのはなぜですか?

分類Dev

インスタンスブロックで最終的な静的変数に値を割り当てることができないのはなぜですか?

分類Dev

間違ったインデックスが割り当てられているのはなぜですか?

分類Dev

パンダを使用してWebサイトからテーブルをスクレイプすると、中央の列がスキップされ、最初の2つと最後の2つだけが印刷されるのはなぜですか。

分類Dev

PostgreSQLでテーブルの適度に大きな割合をフェッチするときに、ビットマップスキャンがインデックススキャンよりも高速なのはなぜですか?

分類Dev

この反復的なリスト成長コードはなぜIndexError:リスト割り当てインデックスが範囲外になるのですか?

分類Dev

マークアップを検査するときに、一部のWebサイトに要素に割り当てられていないスタイルがあるのはなぜですか?

分類Dev

挿入ソート:なぜj+1インデックスにキーを割り当てるのですか?

分類Dev

リストの最初のインデックスに値を割り当てると、値が変わるのはなぜですか?

分類Dev

パンダがインデックスが多すぎる.iloc [i、j]割り当てを黙って無視するのはなぜですか?

分類Dev

行列が割り当ての1行後に値を変更するのはなぜですか?-メープル

分類Dev

このアルゴリズムが最後のインデックスを正しくソートしないのはなぜですか?

分類Dev

djangoテンプレートのforサイクルが、タグの最後にスペースを追加するのはなぜですか?

分類Dev

forループが配列の最後の値をスキップするのはなぜですか?

分類Dev

Java.Util.Stackがループの最後の要素をポップしないのはなぜですか?

分類Dev

Javaのfor eachループが最後の要素にアクセスしないのはなぜですか?

分類Dev

サムスンギャラクシーS6(ロリポップ)が古いデバイスの4倍のメモリをビットマップに割り当てるのはなぜですか

分類Dev

コンパイルエラーなしでユニットをタプルに割り当てることができるのはなぜですか?

分類Dev

インデックス範囲の最後に .ix が含まれるのはなぜですか?

分類Dev

スプライスが最後の要素のみを削除するのはなぜですか?

分類Dev

イベントリスナーがforループで作成された最後の要素にのみ登録されるのはなぜですか?

分類Dev

整数参照への短い変数の割り当てがコンパイル時エラーを生成するのはなぜですか?

分類Dev

共有ポインタの割り当てが「スワップ」するのはなぜですか?

分類Dev

なぜインデックスを参照する必要があるのですか?

分類Dev

一部の仮想ネットワークインターフェイスにプライベートIPアドレスが割り当てられているのに、一部にはループバックIPアドレスが割り当てられているのはなぜですか?

Related 関連記事

  1. 1

    文字列インデックスにint(0)を割り当てると、ループが終了するのはなぜですか?

  2. 2

    連想配列の最後の要素(テーブルごとのインデックス)がによって出力されないのはなぜですか?

  3. 3

    Vueの配列から要素を削除するときに、最後のインデックスで遷移が発生するのはなぜですか?

  4. 4

    Toastがこのループ内の最後の要素にスキップするのはなぜですか?

  5. 5

    Javascript:forループを作成するときに、最後のインデックス番号を出力するのはなぜですか?

  6. 6

    インスタンスブロックで最終的な静的変数に値を割り当てることができないのはなぜですか?

  7. 7

    間違ったインデックスが割り当てられているのはなぜですか?

  8. 8

    パンダを使用してWebサイトからテーブルをスクレイプすると、中央の列がスキップされ、最初の2つと最後の2つだけが印刷されるのはなぜですか。

  9. 9

    PostgreSQLでテーブルの適度に大きな割合をフェッチするときに、ビットマップスキャンがインデックススキャンよりも高速なのはなぜですか?

  10. 10

    この反復的なリスト成長コードはなぜIndexError:リスト割り当てインデックスが範囲外になるのですか?

  11. 11

    マークアップを検査するときに、一部のWebサイトに要素に割り当てられていないスタイルがあるのはなぜですか?

  12. 12

    挿入ソート:なぜj+1インデックスにキーを割り当てるのですか?

  13. 13

    リストの最初のインデックスに値を割り当てると、値が変わるのはなぜですか?

  14. 14

    パンダがインデックスが多すぎる.iloc [i、j]割り当てを黙って無視するのはなぜですか?

  15. 15

    行列が割り当ての1行後に値を変更するのはなぜですか?-メープル

  16. 16

    このアルゴリズムが最後のインデックスを正しくソートしないのはなぜですか?

  17. 17

    djangoテンプレートのforサイクルが、タグの最後にスペースを追加するのはなぜですか?

  18. 18

    forループが配列の最後の値をスキップするのはなぜですか?

  19. 19

    Java.Util.Stackがループの最後の要素をポップしないのはなぜですか?

  20. 20

    Javaのfor eachループが最後の要素にアクセスしないのはなぜですか?

  21. 21

    サムスンギャラクシーS6(ロリポップ)が古いデバイスの4倍のメモリをビットマップに割り当てるのはなぜですか

  22. 22

    コンパイルエラーなしでユニットをタプルに割り当てることができるのはなぜですか?

  23. 23

    インデックス範囲の最後に .ix が含まれるのはなぜですか?

  24. 24

    スプライスが最後の要素のみを削除するのはなぜですか?

  25. 25

    イベントリスナーがforループで作成された最後の要素にのみ登録されるのはなぜですか?

  26. 26

    整数参照への短い変数の割り当てがコンパイル時エラーを生成するのはなぜですか?

  27. 27

    共有ポインタの割り当てが「スワップ」するのはなぜですか?

  28. 28

    なぜインデックスを参照する必要があるのですか?

  29. 29

    一部の仮想ネットワークインターフェイスにプライベートIPアドレスが割り当てられているのに、一部にはループバックIPアドレスが割り当てられているのはなぜですか?

ホットタグ

アーカイブ