4

我试图通过在执行前一个函数后执行下一个函数来产生连锁反应。代码如下所示:

var med = {

    imgLoadTime : 2000,

    easingEffect : 'easeOutQuart',

    scrollEase : 'easeInOutQuad',

    effectDuration : 1000,

    currentPage : '',

    runAnimations : function(){
                        if(this.currentPage == '#slide5'){
                            this.initAssets();
                        }
                    },

    initAssets : function(){
                    $('#asset-1').animate(
                        {left : '50%'}, 
                        { 
                            duration: this.effectDuration, 
                            easing: this.easingEffect, 
                            complete: this.assetTwo 
                        });
                },

    assetTwo : function(){
                    console.log('two');
                    debugger;
                    $('#asset-2').animate(
                        {left : '50%'}, 
                        { 
                            duration: this.effectDuration, 
                            easing: this.easingEffect, 
                            complete: this.assetThree 
                        });
                },

    assetThree : function(){
                    console.log('three');
                    $('#asset-3').animate(
                        {left : '50%'}, 
                        {
                            duration: this.effectDuration, 
                            easing: this.easingEffect, 
                            complete: console.log('weszlo')
                        });
                }

};  

这就是我的对象的样子。然后我运行函数 runAnimations 作为对象的属性。奇怪的是,在这个链中只有assetTwo 函数执行,但没有进一步执行(assetThree)。为什么这样?

4

4 回答 4

3

你不能做这种类型的定义:

complete: this.assetTwo 

它将调用assetTwo,但它没有正确的this值。相反,您需要这样做:

           initAssets : function(){
                var self = this;
                $('#asset-1').animate(
                    {left : '50%'}, 
                    { 
                        duration: this.effectDuration, 
                        easing: this.easingEffect, 
                        complete: function() {self.assetTwo()}
                    });
            },

其他完整功能也一样。您需要将 的值保存this到局部变量中,然后在完整函数中使用它来调用下一个方法。这将确保this为下一个方法正确设置。

于 2012-09-27T23:35:28.183 回答
1

您的 this 随每个功能而变化,您可以通过引用它med来获得所需的结果:

assetTwo : function(){

                //debugger;
                $('#asset-2').animate(
                    {left : '50%'}, 
                    { 
                        duration: med.effectDuration, 
                        easing: med.easingEffect, 
                        complete: med.assetThree 
                    });
            },

更新小提琴:http: //jsfiddle.net/johnkoer/2KHnc/16/

于 2012-09-27T23:37:19.500 回答
0

使用 med 而不是this在您的 javascript 代码中的所有位置。

于 2012-09-27T23:36:44.400 回答
0

对于漂亮的紧凑代码,请使用此处$.Deferred.pipe()描述的 jQuery 链

你应该得到这样的结果:

var med = {
    imgLoadTime: 2000,
    currentPage: '',
    css : {left: '50%'},
    animOptions: {
        duration: 1000, 
        easing: 'easeOutQuart'
    };
    runAnimations: function() {
        if(med.currentPage == '#slide5') {
            $.Deferred(function(dfr) {
                dfr.pipe(function() {
                    return $('#asset-1').animate( med.css, med.animOptions );
                }).pipe(function() {
                    return $('#asset-2').animate( med.css, med.animOptions );
                }).pipe(function() {
                    return $('#asset-3').animate( med.css, med.animOptions );
                })
            }).resolve();
        }
    }
};

未经测试

掌握 Deferreds 的窍门,您将永远不会回头。

除非该med对象由于其他原因很重要,否则拥有runAnimations()而不是对象包装器会更简单:

function runAnimations() {
    var imgLoadTime = 2000,
    currentPage = '',
    css = {left: '50%'},
    animOptions = {
        duration: 1000, 
        easing: 'easeOutQuart'
    };
    if(currentPage == '#slide5') {
            $.Deferred(function(dfr) {
                dfr.pipe(function() {
                    return $('#asset-1').animate( css, animOptions );
                }).pipe(function() {
                    return $('#asset-2').animate( css, animOptions );
                }).pipe(function() {
                    return $('#asset-3').animate( css, animOptions );
                })
            }).resolve();
    }
}

这种方式对固定参数的引用很简单。

于 2012-09-27T23:44:55.823 回答