Несмотря на то, что я уже некоторое время пользуюсь mootools, я еще не особо играл с туземцами. В настоящее время я пытаюсь расширить события, добавив пользовательский метод addEvent рядом с оригиналом. Я сделал это, используя следующий код (скопировано из ядра mootools)
Native.implement([Element, Window, Document], {
addMyEvent:function(){/* code here */}
}
Теперь проблема в том, что я не могу понять, как правильно перезаписать существующий метод fireEvent
так, чтобы я мог по-прежнему вызывать метод orignal после выполнения своей собственной логики.
Я мог бы получить желаемый результат с некоторыми уродливыми хакерами, но я бы предпочел научиться элегантному способу:)
Обновление: попробовал пару уродливых хаков. Никто из них не работал. Либо я не понимаю замыкания, либо я настраиваю не в том месте. Я попытался сохранить Element.fireEvent
во временную переменную (с использованием и без использования замыканий), которую я затем вызвал бы из перезаписанной функции fireEvent (перезаписанной с использованием Native.implement
- так же, как описано выше). В результате получается бесконечный цикл с fireEvent
, вызывающим себя снова и снова.
Обновление 2:
Я следил за выполнением, используя firebug, и он привел меня к Native.genericize
, который, кажется, действует как своего рода прокси для методов нативных классов. Поэтому вместо ссылки на метод fireEvent я ссылался на прокси, и это вызвало бесконечный цикл. Google не нашел никакой полезной документации по этому поводу, и я немного опасаюсь ковыряться под капотом, когда не до конца понимаю, как это работает, поэтому любая помощь очень ценится.
Обновление 3 - оригинальная проблема решена:
Когда я ответил на комментарий Димитара ниже, мне удалось решить исходную проблему самостоятельно. Я пытался создать метод добавления событий, которые уничтожают себя после определенного количества казней. Хотя первоначальная проблема решена, мой вопрос о расширении аборигенов остается.
Вот готовый код:
Native.implement([Element, Window, Document], {
addVolatileEvent:function(type,fn,counter,internal){
if(!counter)
counter=1;
var volatileFn=function(){
fn.run(arguments);
counter-=1;
if(counter<1)
{
this.removeEvent(type,volatileFn);
}
}
this.addEvent(type,volatileFn,internal);
}
});
имя верно? Это лучшее, что я мог придумать, используя свой ограниченный словарный запас.