Добавление пользовательского кода в mootools addEvent - PullRequest
1 голос
/ 28 июня 2010

Несмотря на то, что я уже некоторое время пользуюсь 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);
}
});

имя верно? Это лучшее, что я мог придумать, используя свой ограниченный словарный запас.

1 Ответ

1 голос
/ 28 июня 2010
document.id("clicker").addEvents({
    "boobies": function() {
        console.info("nipple police");
        this.store("boobies", (this.retrieve("boobies")) ? this.retrieve("boobies") + 1 : 1);
        if (this.retrieve("boobies") == 5)
            this.removeEvents("boobies");
    },
    "click": function() {
        // original function can callback boobies "even"
        this.fireEvent("boobies");
        // do usual stuff.
    }
});

добавление простого обработчика событий, который подсчитывает количество пройденных итераций и затем самоуничтожается.

рассматривают события как простые обратные вызовы под определенным ключом, некоторые из которых связаны с конкретными событиями, которые запускаются.

Использование хранилища элементов всегда желательно, если это возможно - оно позволяет вам обмениваться данными об одном и том же элементе между различными областями без сложных проколов или глобальных переменных.

Родные не должны изменяться так, просто сделайте:

Element.implement({
    newMethod: function() {
        // this being the element
        return this;
    }
});

document.id("clicker").newMethod();

Если, конечно, вам не нужно определять что-то, что также относится к окну или документу.

...