Javascript将变量传递给事件函数

时间:2012-11-23 11:24:33

标签: javascript

我无法将i的值传递给scMotion函数

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

为了澄清这个问题,这个for循环正在做其他事情,向dom添加元素。

出于某种原因,即使我在39号,我附加的函数中传递的i值也是i的最终值,即80。

2 个答案:

答案 0 :(得分: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";

这是循环问题中的经典闭包。看到这一点,了解发生了什么:Please explain the use of JavaScript closures in loops

答案 1 :(得分: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' );
}