Как расширить родной метод mootools - PullRequest
1 голос
/ 18 июля 2011

Можно ли расширить функцию addEvent в mootools для выполнения чего-либо, а также вызвать обычный метод addEvent ?Или, если у кого-то есть лучший способ сделать то, что мне нужно, я все годы.

У меня есть разные обработчики кликов в зависимости от того, на какой странице я на сайте.Кроме того, может быть более одного на каждой странице.Я хочу, чтобы каждый клик на странице выполнял фрагмент кода, кроме того, что бы ни делал этот слушатель кликов.Добавление этих двух строк в каждый из обработчиков будет, по меньшей мере, PITA, поэтому я подумал о переопределении addEvent , что каждый раз, когда я добавляю прослушиватель 'click', он создает новую функцию, выполняющую коди затем вызывая функцию.

Есть идеи, как мне это сделать?

1 Ответ

1 голос
/ 18 июля 2011

В то время как это не невозможно, это сомнительная практика - изменение внутреннего API-интерфейса mootools.Если вы не разбираетесь в mootools и не следуете указаниям dev на github и не знаете, что ваши изменения не нарушат совместимость в будущем, я бы порекомендовал против этого.

На мой взгляд, у вас есть два маршрута:

  1. создайте новый метод Element через implement, который выполняет вашу логику.Например: Element.addMyEvent, который делает ваше дело, затем вызывает нормальный element.addEvent после.это является предпочтительным и не имеет реальных побочных эффектов (см. выше)

  2. изменить прототип напрямую.означает, что вы не можете рефакторинг любого кода, и он будет просто работать.это может означать, что у других, которые приступят к работе с вашим кодом, возникнут трудности с его отслеживанием, а также проблемы с трассировкой / устранением неполадок - подумайте, кто-то, кто знает mootools и стандартное поведение addEvent, даже не подумает проверить прототипы, если у них возникнут проблемы.

  3. Выход mootools 2.0, скорее всего, приведет к недопустимости способа 2, описанного выше, если mootools отходит от модификации Element.prototype в пользу оболочки (для совместимости с другими фреймворками).Вернитесь к методу 1 :)

Я думаю, что решение 1 лучше и очевиднее.

как для 2: http://jsfiddle.net/dimitar/aTukP/

(function() {
    // setup a proxy via the Element prototype.
    var oldProto = Element.prototype.addEvent;

    // you really need [Element, Document, Window] but this is fine.
    Element.prototype.addEvent = function(type, fn, internal){
        console.log("added " + type, this); // add new logic here. 'this' == element.
        oldProto.apply(this, arguments);
    };

})();

document.id("foo").addEvent("click", function(e) {
    e.stop();
    console.log("clicked");
    console.log(e);
});

это так просто.имейте в виду, Element.events также следует перейти к документу и окну.кроме того, это не изменит миксин класса Events, для этого вам нужно изменить рефакторинг Events.addEvent.

...