2

私はこの小さなコードソースを持っています

for (i = 0; i < elements.length; i++) {
     console.log(i);
     (function (i) {
         if (elements[i]["id"] == id) {
             index = i;
             console.log(i);
         }
     })(i);
}

console.log(index);

サブ要素 "id" = id; である配列の要素インデックスを見つけたい。しかし、時々 0 と 1 を返します。このコードは、クラス内の関数内にあります。同じ関数を 2 回呼び出しますが、クラス外のパラメーターが異なるため、最初に 0 と 1 を表示する必要がありますが、1 と 0 を表示することもあります。この方法も試しましたがうまくいきません。

var i = 0;
while (i < elements.length) {
    console.log(elements[i]["id"]);
    if (elements[i]["id"] == id) {
        index = i;
        break;
    } else if (elements[i]["id"] != id) {
        i++;
    }
}

console.log(index);

これが私のテストページです。Chromeで開くと(時々発生しますが、Firefoxではほとんど発生します)、ボタンを押すと小さな画像が表示される場合と消える場合があります。「inspect elements -> console」でコンソール出力を確認することもできます。

編集

このようにデバッグを改善するためにコードを変更しました(Landoが提案したように):

for (i in elements){
    console.log("comparing elements['"+ i +"']['id']: "+ elements[i]["id"] +" with id:' "+ id + "'");
        if(elements[i]["id"] == id){
            index = i;
        }
    }

console.log(index);

コンソール出力を取得しました:

comparing elements['0']['id']: id2 with id:' id1' Slideshow.js:140
comparing elements['1']['id']: id1 with id:' id1' Slideshow.js:140
1 Slideshow.js:147
comparing elements['0']['id']: id2 with id:' id2' Slideshow.js:140
comparing elements['1']['id']: id1 with id:' id2' Slideshow.js:140
0 

それがいつあるべきか:

comparing elements['0']['id']: id1 with id:' id1' Slideshow.js:140
comparing elements['1']['id']: id2 with id:' id1' Slideshow.js:140
0 Slideshow.js:147
comparing elements['0']['id']: id1 with id:' id2' Slideshow.js:140
comparing elements['1']['id']: id2 with id:' id2' Slideshow.js:140
1 

編集2

出力を見た後、配列の「要素」内のオブジェクトが場所を変更し、本来あるべき場所にelements[0]["id"]なっ"id2"たことが"id1"わかりました。なぜこれが起こっているのか、またはそれを修正するために何をすべきかはまだ明確に言えません。アイデアがあれば共有してください。

これが私のJSfiddleリンクです

4

2 に答える 2

1

内部関数 (クロージャー) を使用せずに、コードをこれに変更する必要があると思います (最初の console.log は、コードのデバッグに役立ちます (または、firebug を使用してその行にブレークポイントを設定することもできます)。

for (i in elements){
    console.log("comparing elements['"+ i +"']['id']: "+ elements[i]["id"] +" with id:'"+ id + "'");
    if(elements[i]["id"] == id){
        index = i;
        console.log(i);
    }
}

console.log(index);

JavaScript 配列は必ずしも 0 ベースではなく、必ずしもシーケンシャルであるとは限らないことを覚えておいてください。そのため、"for in" は起こり得るエラーを回避するのに役立ちます。この場合、実際にクロージャーが必要になるとは思わないため、クロージャーを削除しました。

于 2012-09-03T14:55:48.133 に答える
1

私は何が問題なのかを見つけました。最初に小さな画像がロードされて、上部に大きな画像が表示されることがあったようです。画像の読み込みがすべてです。とにかくあなたの答えに感謝します。誰もが問題のデバッグを手伝ってくれました。

于 2012-09-05T19:55:36.010 に答える