0

我有一大堆类似的列表项,我想将mousedown()函数附加到。所以我想做的是替换这个:

$('#controls li[id=d1]').mousedown(function(){
    console.log('d1');
});
$('#controls li[id=d2]').mousedown(function(){
    console.log('d2');
});

有了这个:

var loopvar;
for (loopvar = 1; loopvar <= 2; loopvar++) {
    $('#controls li[id=d' + loopvar + ']').mousedown(function(){
        console.log('d' + loopvar);
    });
}

(这是一个简化的例子——我实际上有很多li' 需要处理。)但是当我点击一个 时li,我总是会d3进入控制台。循环结束时的值为loopvar3,所以看起来这就是正在发生的事情。那么如何使用循环附加函数呢?

4

3 回答 3

3

试试这个方法:

var loopvar;
for (loopvar = 1; loopvar <= 3; loopvar++) {
    $('#controls li[id=d' + loopvar + ']').mousedown((function(loopvar){
        return function(e){
            console.log(e);
           console.log('d' + loopvar);
        }
    })(loopvar)); //You create a closure locking in the loop iteration variable
}

但理想情况下,您只需要使用通用类名或使用以选择器开头的 id 将事件绑定到选择器。 小提琴

使用startswith选择器:

$('#controls li[id^=d]').mousedown(function(e){
        console.log(this.id); //here this represents the element you clicked on.
    }
);

小提琴

还要记住,以选择器开头的 id 是一个属性选择器,与类选择器相比会更慢

于 2013-09-11T00:16:49.793 回答
1
  1. 你永远不应该那样做。
  2. 你应该使用类而不是 id。

无论如何要使用 ID,请尝试:

$('#controls li[id^="d"]').mousedown(function(){
    console.log($(this).attr('id'));
});

要使用循环,您必须使用闭包来传递 var,但是像这样分配回调是不好的,请使用上面的方法。

for (var i = 0; i < 3; ++i) {
    (function(loopvar) {
        $('#controls li[id=d' + loopvar + ']').mousedown(function(){
            console.log('d' + loopvar);
        });
    })(i);
}
于 2013-09-11T00:19:34.017 回答
0

如果您编写的示例与您的实际代码非常相似,我会这样解决:

$('#controls').find('li[id]').mousedown(function(){
    console.log(this.getAttribute('id'));
    // If you want to use jQuery...
    // console.log($(this).attr('id')); 
});

请注意,这$('#controls').find('li[id]')$('#controls li[id]')

于 2013-09-11T00:17:01.210 回答