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

전달이 코드에 문제가 변수 "n"은 바로 숫자 만 9 (마지막 번호) 및 모든 10 개 요소에 마우스 휠을 추가 할 mouswheel 함수에 전달되지 않습니다. 누구든지이 함수에 변수를 전달하여 설명하는 방법을 설명 할 수 있습니까?JQuery와 변수 문제

답변

2

나는 자바 스크립트에서 클로저의 문제라고 생각하는데, 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 –

1

은 당신의 n 값은 0-9 또는 1-10에서 가기로되어 있습니까?

0-9이면 n-1 표현식을 모두 n으로 변경하십시오.

1 ~ 10이면 루프를 var n=1,n<=10;n++으로 변경하고 모두 n-1n으로 변경하십시오.

또한 for 루프가 이미 n의 값을 증가시키기 때문에 하단의 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(); 
}); 

편집 : 사실, 심지어 * 슬라이더에 기능을 실제 일치하는 제어를 전달하는 방법을 알아 내기 위해 노력하지만 실제로 내가 아무 생각하는 방법 또는 그한다면이 없다 않는 것을 알고하지 않을 수 있습니다 작업.

+0

고마워요,이 작품은 괜찮아요. 그리고 나는 그 마우스 휠이 이제 이드에게서 가치를 얻는다는 것을 알게되었습니다.하지만 왜 내 솔루션이 작동하지 않는지 설명 할 수 있습니까? 왜냐하면 모든 루프마다 다른 내용 스크롤 요소가 마우스 휠 기능을 갖기 때문입니다. –

+0

실제로 일어난 것은 이벤트 처리기 용으로 만들어진 함수의 n이 외부 루프의 n에 바인딩되어 있다는 것입니다. 실제 변수가 아니라 값입니다. 함수가 호출되면 함수가 작성된 시점의 값이 아니라 변수의 마지막 값을 사용합니다. – tvanfosson

+0

@ Jeremy의 솔루션은 localN이 루프의 각 interation에서 생성 된 새로운 변수이기 때문에 작동합니다. 이 변수는 루프의 각 반복에서 n의 값을 유지하며 함수의 바인딩은 루프의 반복에서 값을 제공합니다. – tvanfosson

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 요소의 마우스 휠 이벤트는 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 
    }); 
}