jquery.click事件未使用预期的计数器变量

jquery.click事件未使用预期的计数器变量,jquery,variables,for-loop,click,counter,Jquery,Variables,For Loop,Click,Counter,我有一个初学者的问题,因为javascript以一种意想不到的方式使用变量“I”: for(var i=0; i<3;i++){ $("a[href=#markers"+i+"]").click(function() { console.info(this); console.info("click: "+i); }); } for(var i=0;i循环将继续增加i变量,与您单击的内容无关 为什么不针对所有具有href以#markers开

我有一个初学者的问题,因为javascript以一种意想不到的方式使用变量“I”:

for(var i=0; i<3;i++){
    $("a[href=#markers"+i+"]").click(function() {
        console.info(this);
        console.info("click: "+i);
    });
}

for(var i=0;i循环将继续增加
i
变量,与您单击的内容无关

为什么不针对所有具有href以
#markers
开头的元素,然后从href获取数字,如下所示:

$('a[href^="#markers"]').on('click', function() {
     var i = $(this).attr('href').replace('#markers','');
     console.log("click: "+i);
});​

或者,如果出于某种奇怪的原因需要循环,则始终可以将变量存储在data()中:


for(var i=0;i这可以通过闭包来解决。在您的情况下,单击事件只分配了变量i。但是当您单击链接时,i的值被设置为3,因为所有点都指向相同的内存位置

使用闭包可以解决这里的问题,因为函数是针对i的当前值执行的。。 试试这个


for(var i=0;i无需为每个链接创建单独的点击处理程序,或单独选择每个链接。
另外,其他答案仅适用于预定义的一组链接(0..2)。
我的版本使用一个选择器、一个处理程序,可以处理任意数量的链接。
即使它们之间有洞

// all of the #markers* href elements
var links = $("a[href^=#markers]");

// common click handler
links.click(function () {
    // get the number from the href
    var num = parseInt($(this).attr("href").substr(8), 10);    
    console.log("click", num);
});

演示小提琴。

Yhea,酷,data()解决方案正是我所需要的!我有大约40个以“href=#marker”开头的解决方案,我不想使用一些疯狂的字符串操作,这会减慢速度;)谢谢!这当然是一个闭包问题,我在开始的回答中写到了这一点,并开始使用解决闭包的常规方法,这是一个额外的函数,但将其编辑掉,因为jQuery对象可以使用data()单独存储数据,它看起来简单多了。一个函数可能会快一点,但还没有真正测试过它吗?我要收回这一点?至少在我的浏览器中,
data()
似乎比一个函数快!这听起来很有趣;我想我会使用
data()
,因为在我的情况下它也更快。谢谢你的解释!我现在问自己,如果我有大约40个(甚至更多)
…闭包或数据()?闭包似乎是更自然的方式,但相当复杂…乍一看似乎很复杂,但一旦你掌握了这个概念,它就简单了..你只是把它封装在一个函数中,传递当前变量并立即执行它,然后返回..这很有趣,但我不明白:变量
num
知道它是如何以
0
开头的?类似于函数(num){}函数声明,…然后调用它func(i)…但是由于它是一个匿名函数(没有名字的函数)…所以您可以立即执行它
$('a[href^="#markers"]').on('click', function() {
     var i = $(this).attr('href').replace('#markers','');
     console.log("click: "+i);
});​
for(var i=0; i<3;i++){
    $("a[href=#markers"+i+"]").data('i',i).click(function() {
        console.info(this);
        console.info("click: "+$(this).data('i'));
    });
}​
for(var i=0; i<3;i++){
  (function(num){
       return  $("a[href=#markers"+num+"]").click(function() {
                  console.info(this);
                  console.info("click: "+num);
               });
   })(i)
}
// all of the #markers* href elements
var links = $("a[href^=#markers]");

// common click handler
links.click(function () {
    // get the number from the href
    var num = parseInt($(this).attr("href").substr(8), 10);    
    console.log("click", num);
});