MOOTOOLS переменная область - PullRequest
2 голосов
/ 01 июля 2010

Я использую mootools: я не могу понять, как использовать переменную при использовании addEvent.

Я хочу использовать цикл for для установки значений в цикле:

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

>

Я ищу форумы, но не могу найти никакой помощи.

Любая помощь будет отличной.

Спасибо

Ответы [ 3 ]

3 голосов
/ 01 июля 2010

Метод addEvent в MooTools принимает два аргумента:

myElement.addEvent(type, fn);

Аргументы:

  • type - (строка) Имя события для мониторинга («щелчок», «загрузка» и т. Д.) Без префикса «on».
  • fn - (функция) Функция для выполнения.

Он не принимает строку, и передача строки, такой как "myFunction()" или "function() { myFunction(); }", не будет работать.

Поскольку вы находитесь внутри цикла, а переменная x будет совместно использовать среду, вам нужно заключить ее значение в другое замыкание. Одним из способов является использование дополнительного закрытия:

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

См. Все вопросы в StackOverflow, касающиеся этой конкретной проблемы создания замыканий внутри циклов.

Также стоит ознакомиться с этой статьей MDC - Создание замыканий в циклах: распространенная ошибка

2 голосов
/ 01 июля 2010

Внимание: этот первый пример не будет работать! Продолжайте читать для объяснения.

Вы путаете onclick синтаксис HTML с MooTools addEvent. Попробуйте

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 ... довольно сложный код, но это пуристический способ. Он также избегает использования страшных eval, возникающих из-за того, что вы вводите addEvent строку. (Похоже, что MooTools все равно не нравится другой вариант.)

1 голос
/ 17 июля 2010

Это вариант использования метода передачи mootools.

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

Pass внутренне создает замыкание, которое содержит x в своей области видимости, поэтому, когда событие click вызывается, оно имеет правильное значение, которое не совпадает с циклом for.

...