从jQuery插件中调用函数

时间:2011-02-23 14:27:31

标签: jquery jquery-plugins

我正在修改可爱的jquery.carousel.js插件以获得自动切换功能。我想用setInterval()来调用一个函数,但我不能让它发挥得很好。

这是我目前的代码:

autoSwitch: function()
{
    if(runAuto)
    {
        $('.next').click();
    }
},
init: function(el, options) {
    if(this.options.auto)
    {
        setInterval("this.('autoSwitch')", this.options.autoTime);
    }
}

这只是一个片段,还有其他东西,但我已经留下了重要的内容。 我遇到问题的一行是setInterval("this.('autoSwitch')", this.options.autoTime);。无论我在setInterval的第一个论点中尝试什么,它都是行不通的。所以。你能不能帮我解决一下我如何从autoSwitch()函数拨打setInterval()的问题?

1 个答案:

答案 0 :(得分:5)

我认为您正在寻找jQuery.proxy

init: function(el, options) {
    if(this.options.auto)
    {
        // Give `setInterval` a function to call
        setInterval(jQuery.proxy(this.autoSwitch, this)), this.options.autoTime);
    }
}

jQuery.proxy确保使用正确的上下文this值)调用函数。有关此一般概念的更多信息,请访问:You must remember this

这是特定于jQuery的。如果您想要更通用的解决方案,可以使用闭包:

init: function(el, options) {
    var context = this;    // Remember what `this` is in a variable
    if(this.options.auto)
    {
        // Give `setInterval` a function to call
        setInterval(function() {
            // The function is a closure that has access to
            // `context`, and so we can call it
            context.autoSwitch();
        }, this.options.autoTime);
    }
}

使用闭包绑定上下文(请参阅:Closures are not complicated),这是执行此操作的常用方法。 jQuery.proxy只是在一个控制良好的环境中进行幕后关闭,所以你知道它并没有关闭比你想要的数据更多的数据。