0

i の値を scMotion 関数に渡すのに問題があります

for ( i = 0; i < tmp.length; i++ ) {
document.getElementById("sc"+i).onmousedown=function() { return scMotion(i,'up') };
}

質問を明確にするために、この for ループは他のことを行っており、dom に要素を追加しています。

何らかの理由で、i が 39 番にある場合でも、関数に渡される i の値は、i の最終値、つまり 80 です。

4

2 に答える 2

6

と関数の間にクロージャーがあるはずなので、入力したiとおりに機能します。

var i="4";
document.getElementById("sc"+i).onmousedown=function() {
    return scMotion(i,'up'); // <-- due to the created closure, the i here
                             //     refers to the i above.
};

ただし、閉鎖であることを忘れないでください。したがって、おそらく次のシナリオがあなたをつまずかせているものです。

var i="4";
document.getElementById("sc"+i).onmousedown=function() {
    return scMotion(i,'up'); // <-- due to the created closure, the i here
                             //     refers to the i above.
                             //     However, when the event happens in the
                             //     future the value of i in here will
                             //     be "5" due to the code below:
};
i = "5";

これは、古典的なループ内閉鎖問題です。何が起こっているのかを理解するには、これを参照してください:ループでの JavaScript クロージャの使用について説明してください

于 2012-11-23T11:32:40.333 に答える
0

代わりに addEventListener を使用してみてください。id を使用して、数値を関数に渡すことができます。

for ( i = 0; i < tmp.length; i++ ) {

    var el = document.getElementById( "sc" + i );

    if ( el.addEventListener ) {

        el.addEventListener( 'mousedown', handleMouseDown ); 

    } else if ( el.attachEvent )  { // for IE8 and previous versions

        el.attachEvent( 'mousedown', handleMouseDown );

    }
}

function handleMouseDown( event ) {

    var num = event.target.id.replace( "sc", "" );
    scMotion( num, 'up' );
}
于 2012-11-23T11:44:43.823 に答える