2010-07-01 8 views
2

mootools를 사용하고 있습니다 : addEvent를 사용할 때 변수를 사용하는 방법을 알 수 없습니다.MOOTOOLS 가변 범위

나는 루프에서 값을 설정하기 위해 다음 루프를 사용하려면 :

for (x=0;x<num;x++){ 
var onclickText = 'function(){onclick="addPageMoveEvent('+x+'"); }'; 
$('pageNum'+x).addEvent('click', onclickText); 
} 

>

내가 검색 포럼을했지만 도움을 찾을 수 없습니다.

어떤 도움도 좋은 것입니다.

감사

+0

정확히 무엇이 잘못 되었나요? – MvanGeest

+2

우선,'for (x = 0; x MvanGeest

+0

"var"문제를 이해하지 못합니다. var 변수가 단순히 전역 변수인지 또는 전역 변수인지에 대한 범위라고 생각했습니다. 왜 그것이 효과가 있습니까? – AAA

답변

2

경고 :이 첫 번째 예는 작동하지 않습니다! 설명을 읽으십시오.

MooTools addEvent과 함께 onclick HTML 구문을 혼동스럽게합니다. 시도해보십시오.

for (var x=0;x<num;x++){ 
    $('pageNum'+x).addEvent('click', 'addPageMoveEvent('+x+');'); 
} 

이것은 더 간단하고 깨끗하지만 여전히 원하는대로 할 수 없습니다. 이 코드는 링크가 클릭 될 때마다 addPageMoveEvent 함수를 호출합니다 ... 원하는 것을 원하는가? 것 같은 행동을 할

프로그램상에서 더 재미 있고 덜 위험한 방법 : Mootools의 위의 방법을 허용하지 않기 때문에

, 당신은 다음을 사용해야합니다

factory = function (x) { return function() { addPageMoveEvent(x); }; }; 
for (var x=0;x<num;x++){ 
    $('pageNum'+x).addEvent('click', factory(x)); 
} 

이 코드는 x 값을 보유하고있는 클로저를 만드는 팩토리를 사용합니다. 다소 복잡한 코드이지만 순수한 방식입니다. addEvent 문자열을 제공하기 때문에 발생하는 무서운 eval 사용을 피합니다. (Mootools의 어쨌든 다른 옵션을 좋아하지 않는 것 같다.)

+0

고마워, 나는 순진 주의자의 방식대로 해봤고 작동한다 !! 감사. 내게 내 이해를 확인해 주시겠습니까? 그 요소에 factory (0) factory (1) 등을 추가 한 다음 x로 해당 factory 값을 전달한다고합니다. – AAA

+0

그 문장을 올바르게 이해한다면 예. 예를 들어'factory (1)'을 호출합니다. 'factory'는 실행될 때'addPageMoveEvent (1)'을 호출하는 함수를 실행하고 리턴합니다. 그런 다음이 함수는'addEvent' 호출에 전달됩니다. 이벤트가 발생하면이 함수가 호출되어 올바른 'addPageMoveEvent' 호출을합니다. 기본적으로'factory'는 팩토리에 전달 된 변수의 *** 값을 전달하는 다른 함수를 호출하는 함수를 제조하는 함수 팩토리 함수입니다. ... 몇 번 읽어보십시오 :) 희망이 도움이됩니다. – MvanGeest

3

Mootools의의 addEvent 방법은 두 개의 인수를 허용합니다

myElement.addEvent(type, fn); 

인수 :

  • 유형 - (문자열) 접두사 'on'없이 모니터 할 이벤트 이름 ('click', 'load'등).
  • fn - (function) 실행할 함수.

문자열을 전달하지 않고 "myFunction()" 또는 "function() { myFunction(); }"과 같은 문자열을 전달하는 기능이 작동하지 않습니다.

루프 안에 있고 변수 x이 환경을 공유하므로 다른 값으로 값을 래핑해야합니다.

$("pagenum" + x).addEvent("click", (function(value) { 
    return function() { addPageMoveEvent(value); } 
})(x)); 

루프 내에서 클로저를 만드는이 특정 문제에 대한 StackOverflow의 모든 questions를 참조하십시오 한 가지 방법은 추가 폐쇄를 사용하는 것입니다.Creating closures in loops: A common mistake

+0

죄송합니다. jQuery에 더욱 익숙해졌습니다. 내 대답을 업데이트 할게. 나는 MooTools가 다른 어떤 프레임 워크보다 더 좋아하지만 점점 더 엄격 해지고 있다고 느낍니다. 참조 링크는 – MvanGeest

+0

+1입니다. – MvanGeest

+0

고마워요 @MvanGuest :) [바인딩] (http://api.jquery.com/bind/) 또는 [클릭]과 같은 속기 기능 중 하나 (http://api.jquery.com/)를 보지 못했습니다. 솔직히하기 전에 실행 가능한 자바 스크립트 코드 문자열을 받아들이는 jQuery에서 /)를 클릭하십시오. – Anurag

1

Mootools의에 대한 사용 사례가 법을 통과 그건 -

또한 체크 아웃은이 MDC 기사 가치가있다.

for (x=0;x<num;x++){ 
    $('pageNum'+x).addEvent('click', addPageMoveEvent.pass(x)); 
} 

패스는 내부적으로 자신의 범위에있는 X를 보유하고 클로저를 작성하므로 클릭 이벤트가 발생 될 때 올바른 값이 for 루프에서의 동일하지 원인이있다.