在開發過程當中遇到了題目描述的問題,使用 Google 搜索,中文答案不多,並且沒有使人滿意的。就在segmentfault上提了一個問題,並且很快我就發現被不少人收藏了該問題(SF網站問題被收藏時,會收到消息提醒)。也有一些網友回答該問題,可是一直沒有優質的答案。github
後來在 Stack overflow 找到比較好的答案,這個回答也是點「贊」數想當高的。英文好的同窗建議直接閱讀英文,英文很差的同窗能夠閱讀下面個人翻譯(英文水平有限,沒有按照字句翻譯,只是根據我對他們的理解來翻譯)。chrome
這個問題主要發生在當Blink
(Chrome的渲染引擎)決定延時執行一個定時器函數的時候。好比:經過requestAnimationFrame
,setTimeout
,setInterval
這些對象執行的函數。由於這些對象在執行函數時至少要花費 50ms的時間,若是在這個時候恰好有用戶在網頁上輸入操做,Blink
會優先執行用戶的輸入操做(好比:scrolls事件,tap事件)。segmentfault
若是你的JavaScript代碼在運行時也出現了這樣的問題,多是使用者觸發了一樣的「行爲」(指在執行定時器函數時,恰好有用戶在操做)。下面有幾種方式來複現這個問題:瀏覽器
經過timer
(定時器函數)觸發了一段執行時間比較長的JavaScript代碼;chrome-devtools
在移動端(或者是在開發者工具中模擬移動設備的模式下);函數
當手指與屏幕發生了真實的接觸,而且發生了輸入或者是滾動的行爲。觸摸頁面或是快速的滾動頁面也會觸發這個問題,可是很是少見的並且不容易復現的。工具
使用開發者工具中的「CPU throttling」模式延長JavaScript
代碼執行時間,可讓你有更好的時機去復現該問題;網站
在console
(控制檯)中打印的消息指向的問題(chromium平臺bug列表),能夠從第40條評論中直接找到解決該問題的方法:spa
在致使「deferral」的頁面打開開發者工具記錄時間線;
選擇整個時間線,而後在窗口底部打開「Event Log」 面板。
在文本輸入框中(Filter過濾的字段)中輸入「Timer Fired」
在列表中查找「總時間」超過50毫秒的定時器函數。這就是問題的所在。(當瀏覽器在處理用戶的手勢的情景下,定時器函數執行超過10毫秒也會觸發該消息)
若是閱讀中文後還沒法理解能夠參考英文截圖