2012-09-10 103 views
2

我已經寫了這個js函數,用於每15秒的持續時間調用ajax。 但應根據其他條件使用Javascript中的SetTimeout和clearTimeout

<script type="text/javascript"> 
    var disableReload = '<s:property value="#session[\'EXECUTOR\'] == null" />'; 
    var tId = window.setTimeout(function() { 
    location.reload(true); 
    //alert(disableReload); 
    if(disableReload){ 
     //alert("Clearing"); 
     clearTimeout(tId); 
    }else{ 
    var url = 'my.action'; 
    var form = document.getElementById('myForm'); 
    var params = Form.serialize(form) + '&ms=' + new Date().getTime(); 
    var myAjax = new Ajax.Request(url, {method: 'post', parameters: params, onComplete: showResponseAction}); 
    } 
}, 15 * 1000); 
</script> 

但當disableReload是真實的限制; clearTimeout不清除/刪除重新加載功能。

我該如何做到這一點。

回答

1

如果我明白你的意圖,那麼這樣的事情是你所需要的:

var disableReload = false; // toggle this to false, on AJAX response(?) to stop repeats 

var repeat = function() 
{ 
    if(disableReload) 
    { 
     clearInterval(intervalID); 
    } 
    else 
    { 
     var url = 'my.action'; 
     var form = document.getElementById('myForm'); 
     var params = Form.serialize(form) + '&ms=' + new Date().getTime(); 
     var myAjax = new Ajax.Request(url, {method: 'post', parameters: params, onComplete: showResponseAction}); 
    } 
} 

var intervalID = window.setInterval(repeat, 1000); 
+0

你錯過了一些代碼。我可以看到情況有點不對。在其他部分。 location.reload(true)將重新加載頁面 – Reddy

+0

@NitinGurram是的,我從你的代碼中複製了它。就像我說的,我試圖通過閱讀你的代碼來理解你的目標,因爲這個問題不是很清楚。 –

+0

我的要求是每1分鐘調用一次ajax函數(比方說)。但我應該能夠根據disableReload變量禁用此功能。所有這些事情都應該在沒有任何按鈕點擊或其他基於用戶的操作的情況下發生 – Reddy

3

因爲,看你的代碼,它看起來像你的頁面被刷新,越來越被調用clearTimeout之前。

3

我不確切知道你期望在這裏發生什麼。

你調用clearTimeout方法超時功能中, - 也就是說,當超時已經過去的代碼纔會被調用,並封閉運行。

clearTimeout的意思是停止運行超時,以便不調用已註冊的閉包。如果(且僅當)超時剛剛開啓,則調用它不會實現任何功能。

我只能建議你再要取消掛起重裝什麼條件想想下 - 並重新排列你的代碼,這樣,當這些情況被觸發clearTimeout被調用,而不是後重裝已經發生了。


編輯:嗯,看來你不一定要取消超時本身,而要從發生基於變量的結果禁用重裝。有一對夫婦的方式我認爲要做到這一點:

  1. 每當你將設置disableReload = true,叫clearTimeout(tId)代替。只要tIddisableReload具有相同的範圍/可見性,這應該可以作爲替代品。
  2. 更改您的超時功能的邏輯,以便重新加載本身的條件是disableReload

前者可能是最清潔的選擇 - 有在保持超時運行,你知道會什麼都不做小一點,而且還避免了怎麼辦的問題,如果事情在超時前將disableReload回false經過。

但後者是一個不太顯着改變現有的代碼,並可能更容易把握:

window.setTimeout(function() { 
    if (!disableReload) { 
     location.reload(true); 

     // I think these are dependent on the disableReload variable too? 
     // If not you can move them outside the if block 
     var url = 'my.action'; 
     var form = document.getElementById('myForm'); 
     var params = Form.serialize(form) + '&ms=' + new Date().getTime(); 
     var myAjax = new Ajax.Request(url, {method: 'post', parameters: params, onComplete: showResponseAction}); 
    } 
}, 15 * 1000); 

這樣,如果disableReload爲真,則什麼也不會發生超時關閉閃光時。

+0

是的。我的要求是每1分鐘調用一次ajax函數(比方說)。但我應該能夠根據disableReload變量禁用此功能。所有這些事情都應該在沒有任何按鈕點擊或其他基於用戶的操作的情況下發生 – Reddy

+0

我看到了 - 我根據您的評論更新了我的答案,因爲聽起來您根本不需要取消超時。 –

+0

@NitinGurram我還是不明白你爲什麼想和你的AJAX請求一起執行'location.reload'。 – Thor84no

2

它看起來像你的disableReload變量是靜態的(永遠不會再寫入)。如果那是真的,你爲什麼首先設置超時?只需將整個var tId = window.setTimeout...包裝在if (!disableReload)中即可。

+0

在調用ajax之後,根據響應我正在更改它的值。 '太長的條件和代碼不會影響這一點。所以我沒有發佈該部分 – Reddy

+1

@NitinGurram這是在你已經在延遲的功能之後。你沒有使用'setInterval',所以它不會重複。在這個階段,你唯一需要做的就是從'function'返回''。您也正在重新加載該頁面,該功能將重置所有內容。 – Thor84no

+0

哎呀..我是js的新手和通過Google搜索學習。您能否根據我的要求爲這個案例編寫js代碼?我會學到:) – Reddy

相關問題