2009-10-26 44 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)。