Цепочка событий AddClass / RemoveClass с Mootools - PullRequest
0 голосов
/ 29 июля 2011

В настоящее время я собираю анимацию css, и для достижения этой цели необходимо изменить имя класса тела через определенные промежутки времени.

Будучи совершенно новым для mootools (и js в целом), лучший способ достижения этой цели - просто добавлять / удалять классы в теле с задержкой, например:

(function() {$(document.body).addClass('load');}).delay(20);
(function() {$(document.body).addClass('load-two');}).delay(2000);
(function() {$(document.body).addClass('load-three');}).delay(2700);
(function() {$(document.body).addClass('load-four');}).delay(4500);

Однако чем больше я читаю на эту тему, тем больше я убежден, что это неэффективный способ достижения того, чего я хочу.

Приведенный выше код работает во всех браузерах, в которых я его тестировал, но лучше ли использовать класс цепочки для достижения того, чего я хочу? Я просмотрел документы Mootools по настройке цепочки, но по какой-то причине я изо всех сил пытаюсь заставить демо работать.

Итак, суть того, что я спрашиваю, заключается в том, есть ли лучший способ написания кода, размещенного выше, и каковы преимущества использования другого метода?

Спасибо.

1 Ответ

2 голосов
/ 29 июля 2011

Настройка цепочки в mootools довольно проста. однако использование класса Chain в качестве миксина может быть немного более сложным.

как правило, он направлен на создание цепочек классов и методов на основе Fx, а не синхронных. скажем, у вас есть эффект анимации движения, у которого в игре link: chain, вы можете .chain(function() {}) сделать инстанс после.

Пример callChain в качестве отдельного устройства - это хорошо и достаточно просто, но он мало что дает в плане контроля времени.

тогда есть линейный подход временной шкалы. в вашем случае ваш первый обратный вызов выполняется через 20 мс, 1980 мс, после этого второй, третий запускается через 1680 мс после второго и так далее. если вы объедините все так, чтобы каждый последующий шаг вызывал следующий, вы должны принять это во внимание и фактически передать время ожидания между двумя действиями.

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

Я попытался немного упростить первое здесь: http://jsfiddle.net/dimitar/mpzzq/

(function(){
    Chain.implement({
        slowChain: function(duration){
            // console.log(duration);
            this.callChain.delay(duration === null ? 500 : duration, this);
        }
    });

    var db = $(document.body);
    var fixBody = function(cn, delay) {
        console.log(arguments);
        db.addClass(cn);
        console.log(cn, delay);
        if (this.$chain.length) {
            this.slowChain(delay || 0);
        }
    };

    var myChain = new Chain(),
        funcs = [{
            fn: fixBody,
            args: ["load"],
            delay: 1980
        }, {
            fn: fixBody,
            args: ["load-two"],
            delay: 700
        }, {
            fn: fixBody,
            args: ["load-three"],
            delay: 2000
        }, {
            fn: fixBody,
            args: ["load-four"],
            delay: 0
        }];

    myChain.chain(
        funcs.map(function(el) {
            el.args.push(el.delay);
            return el.fn.bind.apply(el.fn, [myChain].concat(el.args));
        })
    );

    document.getElement("button").addEvents({
        click: function() {
            myChain.slowChain(20);
        }
    });
})();

поэтому в моем массиве объектов funcs я ​​определяю обратный вызов func, передаваемые аргументы и задержку. имейте в виду, что для самого func установлен диапазон this для экземпляра цепочки, и self вызывает следующий в цепочке, но вы можете легко изменить его и работать с ним.

надеюсь, это даст вам некоторые идеи.

здесь это дубль 2 с функцией декоратора, которая вызывает цепочку с задержкой:

// function decorator.
Function.implement({
    chainDelay: function(delay, bind) {
        // allows you to set a delay for chained funcs and auto call stack (if bind is a chain instance)
        var self = this,                 
            args = (arguments.length > 2) ? Array.slice(arguments, 2) : null;
        return function() {
            setTimeout(function() {
                self.apply(bind, args.concat(Array.from(arguments)));
                if (bind && bind.$chain && bind.$chain.length)
                    bind.callChain.call(bind);
            }, delay);
        }
    },
    justChain: function(bind) {
        // runs a chained func when due and auto calls stack for next (if bind is a chain instance and avail)
        var self = this, args = (arguments.length > 1) ? Array.slice(arguments, 1) : null;
        return function() {
            self.call(bind, args);
            if (bind && bind.$chain && bind.$chain.length)
                bind.callChain.call(bind);
        }
    }
});


var moo = new Chain();

moo.chain(
    // some delayed ones.
    (function(what) {
        console.log(what);
    }).chainDelay(3000, moo, "hi"),
    (function(what, ever) {
        console.log(what, ever);
    }).chainDelay(3000, moo, "there", "coda"),
    (function(what) {
        new Element("div[id=foo][html=" + what +"]").inject(document.body);
    }).chainDelay(1000, moo, "mootools FTW!"),
    // regular ones here for good measure!    
    (function() {
        document.id("foo").setStyle("color", "red")
    }).justChain(moo),
    (function() {
        document.id("foo").setStyle("background-color", "blue")
    })    
);

moo.callChain();

пример этого: http://jsfiddle.net/dimitar/Y4KCB/4/

...