2009-10-26 45 views
0

我有这样的代码:的JavaScript/jQuery的setTimeout的

$('.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后删除函数?

回答

0

你可以尝试把return false;放在if语句的那个​​分支的末尾?

或者,你可以简单地设置这样的标志作为hasRun = 1,并简单地检查该值运行的if语句分支里的任何东西之前...

+0

实际上这是我的脚本的简化版本;我的原始脚本是一个上传图片的插件。所以当我点击亩按钮,我想上传图片(使用IFRAME)...和当图片加载时...我的PHP文件在我的iframe中写入“”...所以我检查与setTimeout是否上传文件。所以每当我点击我的按钮,我想上传一张图片。那么我能用这个标志做什么? – kmunky 2009-10-26 20:43:31

0

else条件你只是在设定的时间-out ...你也应该更新'expectedValue'的值......对吧?

return因此为条件的布尔值。

您可以使用新的布尔标志...或使用现有的值用于相同的目的。 让我知道你是否需要阐述。

+0

pfff ...我可以让它工作...你能告诉我我的代码的答案吗? – kmunky 2009-10-26 21:17:08

0

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

+0

好的,但我应该在哪里调用clearTimeout在我的代码? – kmunky 2009-10-26 20:49:54

+0

...在调用setTimeout之前。 – 2009-10-26 21:49:55

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)。