我正在修改可爱的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()
的问题?
答案 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
只是在一个控制良好的环境中进行幕后关闭,所以你知道它并没有关闭比你想要的数据更多的数据。