Jquery传递变量问题

时间:2009-04-04 21:36:44

标签: javascript jquery

    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个元素。 任何人都可以解释如何将变量传递给此函数以使其保持不变吗?

6 个答案:

答案 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
  });
}