2012-03-16 84 views
1

我有一個使用jQuery來加載一個文件一個DIV /有一個javascript函數內容..運行js函數一次發射時不止一次

function DoWork() { 
    // Do Stuff 
} 

比方說,用戶可以重新加載div和拉同文件/內容具有相同的js函數DoWork()。問題是,當文件重新加載時,先前加載的函數DoWork()仍在運行。我怎樣才能殺掉之前解僱的DoWork()並重新啓動它?

+1

你是什麼意思「重新加載div」?這是通過事件處理程序處理的嗎?如果是這樣,那麼爲什麼不解開處理程序一旦被解僱呢? (或使用類似jQuery的'once') – abesto 2012-03-16 18:46:19

+0

最簡單的方法是將原始函數聲明放在條件if(typeofDoWork ==='undefined'){functionDoWork(){...}}'如果它還沒有被發現。 – 2012-03-16 18:46:49

+0

DoWork中是否存在間隔?什麼是使用模式?爲什麼需要很長時間才能運行? – 2012-03-16 18:47:46

回答

3

Javascript是單線程的,這意味着只有一件事可以在給定的時刻執行。如果DoWork已經「正在運行」,它可能是:a)阻止所有其他JS代碼,並且由於無法執行任何中斷代碼,直到它自行完成,或者b)012b間隔通過setTimeout()setInterval()發射。

如果是後一種情況,setTimeout()setInterval()會返回一個ID。根據您的啓動方式將該ID存儲在某個地方,然後撥打clearTimeout(doWork_timeout_id)clearInterval(doWork_interval_id)

1

您可以構建一個簡單的函數,使用:setTimeout,然後每次調用DoWork將首先調用:clearTimeout。我不太喜歡這個解決方案,因爲你會在setTimeout上浪費CPU。 因此,另一種選擇是在DoWork中使用web worker(如果您正在處理大數據,因爲它在另一個線程中運行,它將爲您做很多其他好事) - 然後您可以選擇發送「停止」消息每次您開始DoWork()的工作時。

0

你使用ajax來加載div的內容?如果是這樣,更好的辦法如下:

var doWorkAjax=null; 
function DoWork(){ 
    if (doWorkAjax) doWorkAjax.abort(); 
    doWorkAjax = $.ajax(url, data, function(result){ 
     .... 
     doWorkAjax=null; 
    }); 
} 
+0

是的我使用AJAX加載包含js函數DoWork()的Div文件中的php文件, – Joe 2012-03-16 19:24:03