通过for循环添加单击事件

时间:2013-01-26 22:27:26

标签: jquery

此代码工作正常 - 单击第一个(li)产生“0”并单击第二个(li)产生“1”。

$("li").eq(0).click(function () { alert(0) });
$("li").eq(1).click(function () { alert(1) });

但是,我宁愿使用for循环。如下所示,每个(li)产生“2”。

for (var i = 0; i < 2; i++) {
            $("li").eq(i).click(function () { alert(i) });
        }

为什么呢?提前致谢。如果这是显而易见的事情,请道歉,但它让我发疯。

4 个答案:

答案 0 :(得分:2)

使用jQuery index()方法更简单,不需要for循环:

$('li').click(function(){ 
   /* "this " is element clicked*/       
    alert( $(this).index() );
});

使用不带参数的index()将返回与其兄弟相关的元素索引。还有一些方法可以将index()用于其他元素集合

API参考:http://api.jquery.com/index

答案 1 :(得分:2)

这叫做封闭。执行此操作时,您将设置一个名为i的全局变量。因此,当您单击它时,您的click函数会记住此变量,该变量始终为2,因为它是循环结束时的值。

现在为什么它是一个全局变量?,因为javascript具有函数scop而不是块作用域

<script type="text/javascript">
    var imGlobal = "Hello!";
    // ^ Watch out for the scope! I'm NOT inside a function

    for (var i = 0; i < 2; i++){}
    // ^ Watch out for the scope! I'm NOT inside a function EITHER!!!

    function(){
        // ^ Watch out for the scope! I'm inside a function
        var imNOTGlobal = "I won't exist after the function has returned (under certain circumstances ;])";
    }();
    console.log(imGlobal);    //"Hello!"
    console.log(i);           //2
    console.log(imNOTGlobal); //undefined
</script>

Closure是一种javascript方式来做这样有用的事情:

// To get the nth prime number
var getPrimeNumber = function (){
    var primeNumbers = [];
    return function(n){
        if(!primeNumbers[n]){
            // Calculate the nth prime number and insert it into the array.
        }

        return primeNumbers[n];
    };
}(); // The function is executed immediately 
// making "var getPrimeNumber" to hold the result of the execution 
// which is a function that remembers primeNumbers 
// and is who does the actual calculation

getPrimeNumber(1);
getPrimeNumber(2);
getPrimeNumber(3); // Calculate it the first time
getPrimeNumber(4);
getPrimeNumber(3): // This is already calculated!
// The array ends up with 4 slots;    

每当你调用这个函数时,它会检查它是否已经计算了第n个素数并将它存储在一个可以为闭包访问的数组中,这样你就不必每次都要求函数计算nth号。

现在,有什么用呢?:你可以使用每次调用getPrimeNumber();时都没有初始化的变量,而且这个变量不是全局对象。

注意:该功能不起作用,但说明了这一点。

答案 2 :(得分:1)

变量i是全局变量。在for循环之后,它的值为2,每次单击任何li元素时,它都会警告i的值,现在为2。

尝试:

for (var i = 0; i < 2; i++) {
   $('li').eq(i).click(function() { 
         alert( $(this).index() ); 
    });        
}

答案 3 :(得分:0)

关闭是一个婊子:) 你应该做这样的事情 - 这将抓住&#34;正确的&#34;我

function createAlertFunction(i) {
    return (function onClickFunc () {
        alert(i)
    });
}

for (var i = 0; i < 2; i++) {
    $("li").eq(i).click = createAlertFunction(i);
}