Jquery passing variable problem
1 2 3 4 5 6 7 8 9 10 | 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个元素。
任何人都可以解释如何将变量传递给此函数,以便它保持?
我使用完全jQuery解决方案。
1 2 3 4 5 6 7 8 | $("[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(); }); |
编辑:实际上,我甚至可能试图找出一种方法将实际的匹配控制传递给滑块*函数,但不知道它们实际上做了什么我不知道如何或是否可行。
这在SO上被问了很多(例如)。您需要一个闭包来"捕获"每次迭代中
1 2 3 4 5 6 7 8 9 10 | 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); } |
我相信这是javascript中的闭包问题,n实际上是对外部n变量的引用。我相信以下内容应该有效:
1 2 3 4 5 6 7 8 9 10 11 12 | 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++; } |
代码不起作用的原因是因为在循环期间不评估n变量。
您正在循环中创建一个匿名函数,并传递给
如果您改为使用
1 2 3 4 5 6 7 8 9 10 11 | 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)吗?
您的
如果它是0-9,则将所有
如果是1-10,则将
另外,删除底部的
在这种情况下,JQuery特别允许传递事件数据,这些事件数据可能会或可能不会对您有用:
1 2 3 4 5 6 7 8 9 | 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 }); } |