0

我有这个代码:

$('.myButton').live('click',function(){
    var checkTextValue = setTimeout(function() {
    var textVal = $('p').text();
    if (textVal == 'expectedValue'){
        alert('done');
    } else {
       setTimeout(arguments.callee, 10);
    }
    },10);
 });

当第一次单击按钮时,它工作得很好,但是当多次单击按钮时,警报被调用 n+ 次(如果我在按钮上再单击一次,则会弹出警报->我单击“确定”,然后再弹出一个警报;在此之后,如果我再单击一次,则会弹出 3 个警报);有没有办法在 textVal == 'expectedValue' 返回 true 后删除该函数?

4

4 回答 4

0

您可以尝试将 areturn false;放在 if 语句的该分支的末尾吗?

或者,您可以简单地设置一个标志,例如hasRun = 1, 并在 if 语句的该分支内运行任何内容之前简单地检查该值......

于 2009-10-26T20:28:13.193 回答
0

else您只是设置超时的情况下...您还应该更新“expectedValue”的值...对吗?

以及return相应的条件布尔值。

您可以使用新的布尔标志...或将现有值用于相同目的。如果您需要详细说明,请告诉我。

于 2009-10-26T20:29:41.740 回答
0

您需要clearTimeout在调用之前清除超时(使用)setTimeout以防止同时执行。

于 2009-10-26T20:39:49.910 回答
0

您可以使用setInterval()来实现这一点,而不是setTimeout()

var intervalId = 0;
$('.myButton').live('click', function(){
    if (intervalId != 0) {
        clearInterval(intervalId);
    }
    intervalId = setInterval(function() {
        var textVal = $('p').text();
        if (textVal == 'expectedValue'){
            clearInterval(intervalId);
            intervalId = 0;

            alert('done');
        }
    }, 10);
});

这种方法的另一个优点是您可以确定他们是否已经单击它并提及它已经被检查。

var intervalId = 0;
$('.myButton').live('click', function(){
    if (intervalId != 0) {
        alert('check already in progress... please wait');
        return false;
    }
    intervalId = setInterval(function() {
        var textVal = $('p').text();
        if (textVal == 'expectedValue'){
            clearInterval(intervalId);
            intervalId = 0;

            alert('done');
        }
    }, 10);
});

或者,您可以提示他们并询问用户是否要停止检查(在这种情况下,只需清除间隔并将 intervalId 设置为 0)。

于 2013-06-04T06:37:55.710 回答