使用Mootools链接AddClass / RemoveClass事件

时间:2011-07-29 10:04:29

标签: javascript mootools addclass chain

我目前正在整理一个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 个答案:

答案 0 :(得分:2)

在mootools中建立一个链很简单。但是,使用Chain类作为mixin可能会更多一些。

通常,它正朝着基于Fx的类和方法的链接而不是同步的链接。假设您有一个有link: chain的补间效果,您可以.chain(function() {})该实例在之后执行其他操作。

the callChain example作为一个独立版本很简单,但它在时序控制方面提供的很少。

然后是线性时间线方法。在你的情况下,你的第一个回调运行在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范围设置为链实例,并自动调用链上的下一个范围,但您可以轻松地对其进行修改并使用它。

希望它能给你一些想法。

这里是带有装饰器函数的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/