for(var n=0;n<10;n++)
{
$('#content-scroll'+n).mousewheel(function(event, delta) {
if (delta > 0) sliderUp(n-1);
else if (delta < 0) sliderDown(n-1);
return false; // prevent default
});
n++;
}
我的代码有问题,变量“n”没有传递给mouswheel函数,它只将鼠标滚轮添加到数字9(最后一个数字)而不是所有10个元素。 任何人都可以解释如何将变量传递给此函数以使其保持不变吗?
答案 0 :(得分:3)
我使用完全jQuery解决方案来解决这个问题。
$("[id^='content-scroll']").mousewheel( function(event,delta) {
var n = this.id.replace(/content-scroll/,'');
if (delta > 0)
sliderUp(n);
else if (delta < 0)
sliderDown(n);
event.preventDefault();
});
编辑:实际上,我甚至可能试图找出一种方法将实际匹配控件传递给滑块*函数,但不知道它们实际上做了什么我不知道如何或如果会工作的。
答案 1 :(得分:2)
我认为这是javascript中的闭包问题,n实际上是对外部n变量的引用。我相信以下内容应该有效:
for(var n=0;n<10;n++)
{
var localN = n;
$('#content-scroll'+n).mousewheel(function(event, delta) {
if (delta > 0) sliderUp(localN-1);
else if (delta < 0) sliderDown(localN-1);
return false; // prevent default
});
//is this really needed??
//n++;
}
答案 2 :(得分:2)
在SO(case in point)上问了很多。您需要一个闭包来“捕获”每次迭代中n
的值:
for(var n=0;n<10;n++)
{
(function(n){
$('#content-scroll'+n).mousewheel(function(event, delta) {
if (delta > 0) sliderUp(n-1);
else if (delta < 0) sliderDown(n-1);
return false; // prevent default
});
})(n);
}
答案 3 :(得分:1)
您的n
值应该是0-9还是1-10?
如果是0-9,则将所有n-1
表达式更改为n
。
如果是1-10,请将for
循环更改为var n=1,n<=10;n++
,将所有n-1
引用更改为n
。
另外,请移除底部的n++
,因为for
循环已增加n
的值。
答案 4 :(得分:1)
代码不起作用的原因是因为在循环期间不评估n变量。
您正在循环中创建一个匿名函数,并传递给mousewheel
函数,因此在鼠标滚轮出现之前,匿名函数中的代码不会执行。到那时,n变量的值是10,或者如果你在代码中的任何其他位置使用变量,那么可能是完全不同的。
如果您改为使用Function
函数从字符串创建函数,则可以将n变量的当前值注入代码中:
for(var n=0; n<10; n++) {
$('#content-scroll' + n).mousewheel(
Function('event', 'delta',
'if (delta > 0) sliderUp(' + (n-1) + ');' +
'else if (delta < 0) sliderDown(' + (n-1) + ');' +
'return false; // prevent default'
)
);
}
但是,它应该是(n-1)吗? content-scroll0
元素的mousewheel事件是否应调用sliderup(-1)
?
答案 5 :(得分:0)
JQuery特别允许传递事件数据,在这种情况下可能会或可能不会对您有用:
for(var n=0;n<10;n++)
{
$('#content-scroll'+n).bind('mousewheel', {index:n}, function(event, delta) {
var innerN = event.data.index;
if (delta > 0) sliderUp(innerN-1);
else if (delta < 0) sliderDown(innerN-1);
return false; // prevent default
});
}