2010-07-07 71 views
6

我們想知道是否有可能使用jQuery檢查多個元素,並根據通過單擊指定給他們的類型執行其他功能。基本上,一個可以永久運行的功能,而用戶不會刷新頁面。jQuery無限函數執行

這個想法不是依賴事件點擊來執行一個函數,而是依賴於分配給特定元素的類。

例如:

$("td.gantt").each(function() { 
    if($(this).hasClass("oper")) { 
     //execute a serie of functions 
    } 
    if($(this).hasClass("preop")) { 
     //execute a serie of functions 
    } 
}); 

上述被執行一次,我們需要運行所有的時間。

回答

17
// define a function... 
function ganttEach() { 
    $("td.gantt").each(function() { 
    // ... 
    }); 
} 

// ...repeat it once every second 
window.setInterval(ganttEach, 1000); 

你不能「讓它運行所有的時間」(如,在while(true)循環),因爲JavaScript是單線程和阻塞線程意味着你其他代碼永遠不會運行。 setInterval()確保其他代碼執行時有必要的「空白」。

setInterval()返回一個ID,您可以將其存儲在一個變量中,並在某個點處反饋給clearInterval()以使其再次停止。


如果你想確保你的函數的每一個新的迭代開始只後的前一個已經真正完成,使用setTimeout()代替:

// define a self-repeating function... 
function ganttEach() { 
    $("td.gantt").each(function() { 
    // ... 
    }); 
    window.setTimeout(ganttEach, 1000); // calls itself again in one second 
} 

// ...initiate self-repeating function 
ganttEach(); 

你或許應該包括某種方式在這裏停止無盡的重複,就像引入一個在setTimeout()調用之前檢查的標誌。

+0

+1 for setTimeout() – 2010-07-07 16:33:00

+0

+1 yeah站點超時可以避免輪詢 – galambalazs 2010-07-07 16:45:17

+0

帶寬消耗如何?在IE下性能如何? – betacar 2010-07-07 18:54:33

0

我不確定你想要做什麼,但你有沒有嘗試setInterval?如果這是你真正想要的,它將繼續運行。

3

這是可能的,與setInterval。我的建議是選擇重複功能以外的元素,以便最小化開銷

無限循環將鎖定瀏覽器UI,因爲它是一個單線程環境。設置時間間隔,但是您可以將操作添加到用戶界面堆棧,這些操作將在給定的時間段後執行。您可以在setInterval第二個參數中指定此期間。

// select the element outside 
// to minimize overhead 
$gantt = $("td.gantt"); 

// define a repeating action 
setInterval(function() { 
    $gantt.each(function() { 
     if($(this).hasClass("oper")) { 
      //execute a serie of functions 
     } 
     if($(this).hasClass("preop")) { 
      //execute a serie of functions 
     } 
    }); 
}, 100); // repeat interval: 100ms 
+2

提及在函數之外定義'$ gannt'變量的好處。 – Tomalak 2010-07-07 16:26:45

+0

@galambalazs:我喜歡我的「+1」評論如何吸引兩張選票(其中一張是你自己的,我猜),但你的答案本身仍然只有+1。 ;-)如果我碰巧同意「+1」的評論,我是否也應該投票回答?嗯... :-) – Tomalak 2010-07-07 16:50:34

+0

@Tomalak我upvoted,因爲它有一個有效點(setTimeout),我想過但後來忽略。但是,在給了我另一個想法之後,我意識到即使我永遠不會做這樣的事情,如果函數聚集在UI堆棧中,長的jQuery代碼庫可能會導致瀏覽器掛起。而且,既然你寫了它,我給你+1,因爲它應該突出顯示。 :) – galambalazs 2010-07-07 16:54:24

3

你可以運行你的支票每隔幾毫秒,50毫秒說,使用的setInterval

window.setInterval (function() { 
    // do checks here 
}, 50); 

也許最終你會使用大量的CPU處理能力,如果你的檢查過於頻繁,或太複雜。

+0

該解決方案具有可以從身體運行的優點。 – 2015-06-12 22:49:30