2009-04-04 2 views
1
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++; 
} 

У меня есть проблема с этим кодом, переменная «п» не передается право на функцию mouswheel которая добавит колесика мыши только номер 9 (последний номер), а не ко всем 10 элементов. Может ли кто-нибудь объяснить, как передать переменную этой функции, чтобы она оставалась?Jquery проходит переменная проблема

ответ

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++; 
} 
+0

Если это не сработает, попробуйте переместить localN внутри колесика мыши (function() {var localN = n-1;}) – bendewey

+0

Нет, это не работает, причина в том, что колесико всегда принимает последнее значение localN или n – 2009-04-04 21:55:08

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.

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(); 
}); 

EDIT: На самом деле, я могу даже попытаться выяснить способ передать фактический контроль соответствия с ползунком * функции, но не зная, что они на самом деле у меня ни малейшего представления о том, как или, если это будет Работа.

+0

Спасибо, это прекрасно работает, и я понял, что теперь колесико мыши получает ценность от своего Идентификатора.Но можете ли вы объяснить, почему мое решение не сработало, потому что в каждом цикле еще один элемент прокрутки контента получил свою функцию «mousewheel». – 2009-04-04 21:59:05

+0

Я считаю, что это произошло потому, что в действительности функция n, созданная для обработчика события, привязана к n ​​во внешнем цикле - фактическая переменная, а не значение. Когда функция вызывается, она использует последнее значение переменной, а не значение, когда была создана функция. – tvanfosson

+0

@ Решение Джереми работает, потому что localN - это новая переменная, созданная в каждом взаимодействии цикла. Эта переменная сохраняет значение n на каждой итерации цикла и привязка к ней в функции дает вам значение на этой итерации цикла. – tvanfosson

1

Причина, по которой код не работает, состоит в том, что переменная n не вычисляется во время цикла.

Вы создаете анонимную функцию в цикле, которую вы передаете функции mousewheel, поэтому код в анонимной функции не выполняется до тех пор, пока колесо мыши не произойдет. К тому времени значение переменной n равно 10 или, возможно, что-то совершенно другое, если вы используете переменную где-либо еще в коде.

Если вы вместо того, чтобы использовать функцию Function для создания функции из строки, вы можете придать текущее значение русской переменной в коде:

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' 
    ) 
    ); 

} 

Однако, она должна быть (п-1) ? Должно ли событие mousewheel для элемента content-scroll0 позвонить sliderup(-1)?

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); 
} 
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 
    }); 
} 
Смежные вопросы