2014-11-24 106 views
3

我不明白爲什麼API包括cancelAnimationFrame(),因爲 我可以通過設置變量continue這樣停止動畫:爲什麼我會永遠需要cancelAnimationFrame()

function draw(timestamp) { 
    if (continue == true) { requestAnimationFrame(draw); } 
} 

所以問題是在什麼情況下我應該使用cancelAnimationFrame()?

+0

api背後的概念是將意圖傳達給設備。我懷疑它是在這些方面。 – 2014-11-24 15:35:23

+3

您的代碼演示如何有條件地計劃下一個動畫幀,但不演示如何取消先前預定的動畫回調。可能會出現一些情況(例如,當用戶觸發另一個互斥的動畫時),您可能希望在安排新動畫之前取消未決的動畫回調(類似於jQuery的'stop()'方法)。 – 2014-11-24 15:47:06

回答

0

首先,重要的參考點。 A(日)(候選推薦)規格:http://www.w3.org/TR/animation-timing/#definitions

關聯與每一個文檔是一個動畫幀請求回調列表,其是元組的列表。句柄是一個整數^[long],用於唯一標識列表中的條目。回調是一個FrameRequestCallback對象。最初,Document的動畫幀請求回調列表爲空。

此外,讓我們記住這些規範的目標受衆是用戶代理開發人員。在這些規範的實現中,用戶代理爲我們(應用程序開發人員)提供了一個API來與接口進行交互。

注意每個文件以上情緒;你可以有multible文件在window,或背景。你可以有多個上下文在瀏覽器上下文。

那麼,如何,涉及到每個文檔?好了,(建議)符合規範引用過程模型,基本上所有轉儲這些列表到一個空表,並執行回調對「保護」名單的結果調用算法 ..但同樣,這是可能不是我們作爲應用開發者的關注; *我認爲,作爲應用程序開發人員,我們不會在我們自己的window上下文的多個文檔中跟蹤和維護甚至是Document.FrameRequestList實例。我們只與API接口,可通過window訪問。

現在,讓我們總結一下requestAnimationFrame(<function>)確實有效,什麼回報

調用​​並提供function作爲回調,增加了一個條目<handler,FrameRequestCallback><long, "an object, with a cancelled member, that encapsulates your function">)成動畫幀請求回調列表​​返回Handler [long]

根據上述規範(http://www.w3.org/TR/animation-timing/#dom-windowanimationtiming-cancelanimationframe

的cancelAnimationFrame方法用於取消先前請求作出安排一個動畫幀更新。

人們可以推斷,通過調用cancelAnimationFrame和作爲參數供給(大概先前存儲的)handle,你除去動畫幀請求回調列表BUT該ISN的條目這種情況。

當cancelAnimationFrame(手柄)被調用時,用戶代理必須被取消標誌設置爲true這個文件手柄註冊的回調手柄取消標誌設置回調是否在動畫幀請求回調列表或不。如果沒有給定句柄的回調,那麼這個函數什麼都不做。

因此,您在cancelAnimationFrame中提供的handle不會修改列表。它將取消標誌設置爲真'在回調'..這真的阻止它運行。這是合理的,因爲上述(以上)處理模型


所以,你的問題(在問候你的問題的特定評論)跳過一個條目的動畫幀請求回調列表文件的的增加,使用​​不保留現有的scheduled條目(或其取消標誌爲false的現有條目)不能運行。有一個「更大的」上下文和處理模型需要考慮(其中包括文檔頁面可見性屬性)。

在你的問題中,有人提到你有可能想要取消計劃框架請求 - 但更好的推理是針對無意的方面和考慮。

總之,如果您打算使用API​​請求進行回調的幀更新,請使用API​​取消/停止所述更新請求並停止回調。