9

我正在使用 jQuery 在几个元素上设置一个计时器或间隔循环,以每隔几秒钟检查一次它们。我试过设置一个计时器并检查是否应该重新启动它,或者设置和间隔并检查是否应该停止它。

虽然简化了,但这基本上是我需要的:

var mytimers = new Array();
$('div.items').each(function() {
    myID = $(this).attr('id');
    mytimers[myID] = setInterval( function() { myFunction(myID) } , 3000)
});
function myFunction(param) {
    alert(param);
    if (something()) {
        clearInterval(mytimers[param]);
    }
}

类项的 ID 为 id_1、id_2、id_3。但我只是收到 3 个警报,所有警报都给出 id_3。在我的代码中,我开始尝试传递“this”,但不断简化它以找出问题所在。

我怎样才能让它每次都将变量复制到一个新地址?我知道我需要使用闭包。无论如何,它似乎都在引用另一个 var。

我尝试将其简化为带有计时器的循环,如下所示:

function tester(item) {
    return function() {
        alert(item);
    };
}
for(x=1;x<=3;x++) {
    setTimeout( '(function() { tester(x) })(x)' , 3000);
}

但我认为我只是让我的问题变得更糟,这似乎没有任何作用。

我已经搜索了以前的问题,但大多数都充满了大量额外的代码,而不是减少特定问题并以其他方式解决。我想通过让这个例子工作来了解它是如何更好地工作的。在写这篇文章的时候,我确实设法弄清楚我可以用一个帮助功能来启动计时器。

function tester(item)
    alert(item);
function myTimer(item)
    setInterval( function() { tester(item); }, 3000);
for(x=1;x<=3;x++)
    myTimer(item);

没有那个怎么办?有没有更好的办法?

4

3 回答 3

4

具有匿名函数本地的变量“myID”,

var myID = $(this).attr('id');
于 2010-07-20T20:32:00.880 回答
3

当你使用 each 时,你处于一个闭包中,你只是忘记了 var 使你的变量在函数范围内私有

var mytimers = new Array();
$('div.items').each(function() {
    **var** myID = $(this).attr('id'); 
    mytimers[myID] = setInterval( function() { myFunction(myID) } , 3000)
});
function myFunction(param) {
    alert(param);
    if (something()) {
        clearInterval(mytimers[param]);
    }
}
于 2010-07-20T20:34:36.833 回答
1

所以你想myFunction每三秒在每个匹配的元素上运行一次?

试试这个:

$('div.items').each( myFunction(this) );

var myFunction = function(elem) {
    return function() {
        if ( something(elem) ) {
            //return or do something with elem
        } else {
            window.setTimeout( myFunction(elem), 3000 );
        }
    }
};

如果满足 in 的条件,something()您就完成了,否则,该函数会安排自己在 3 秒内使用与以前相同的元素再次运行。您可以在不同的元素上多次调用它,每个调用都有自己的elem.

我更喜欢传递像 elem 这样的对象,并延迟使用它们的内部结构,直到最后一刻。让我们something()担心 id 或其他什么。

具有关联数组的其他体操(而不是new Array()您可以只使用{})、或clearInterval、或 ID 都不是必需的。

正如 Marimuthu 所说,要真正解决您的解决方案,您放弃var了 的声明myID,这意味着它是全局的,并且每次迭代都会被覆盖。结果是,当setInterval调用myFunction而不是通过闭包获得唯一的本地myID时,您会获得已经被覆盖无数次的全局。

于 2010-07-20T20:45:05.990 回答