【IE11】JavaScriptのfor文内でaddEventListenerを使うとインデックス番号が狂う件について

JavaScript

どれだけ技術が発展しても、いまだに足を引っ張り続ける問題児、IE11。

なんと2021年現在、そのシェアは国内で第4位なんだとか。

そんなIE11に今回も悩まされました。

スポンサーリンク

起こったこと

for (let i = 0; i < domlist.length; i++) {
    domlist[i].addEventListener('clicl', function() {
        console.log(domlist[i]); // <- クリックした要素が表示される
    });
}

こんな感じで、取得した要素を一つずつ取り出して、

addEventListenerでイベントを設定する、なんてことをよくすると思います。

この場合、要素をクリックすると、クリックした要素が表示されるはずです。

しかし、IE11ではそうはいきませんでした。

クリックするとなぜか、undefinedが表示されてしまうのです!

解決方法

解決方法はシンプルで、domlist[i]を一度変数に代入するだけでOK。

どうやらIE11だと「i」の値が、

なぜか「domlist.length」の値になってしまうらしく、

そりゃあ取得できないわけです。

for (let i = 0; i < domlist.length; i++) {
    let dom = domlist[i]; // <- 代入
    dom.addEventListener('clicl', function() {
        console.log(i); // <- 試しにiを出力すると、domlist.lengthの値になっている
        console.log(dom); // <- クリックした要素が表示される
    });
}

しかし、リストから要素を取得できるようになっても、

根本の「i」は間違った値のままなので、

イベント内で「i」を使う場合には注意が必要です。

タイトルとURLをコピーしました