2010-11-11 56 views
0

信息:我不知道的JavaScript。沒有。什麼時候被認爲是「加載」的網頁,在JS等存在

我很好奇,如果有什麼方法可以確定網頁何時完全加載?比方說,我有一個爬蟲,它使用webkit來渲染頁面(和webkit的JS引擎來解析任何JS函數,並完成處理DOM等),我很好奇,如果有什麼方法知道網頁何時「完成」加載?我認爲要做的事:

1)所有的腳本都已經完成執行。 2)沒有待處理的AJAX調用。 3)根據當前可用的信息完整處理和加載DOM。

對於一個更具體的假設,通過查看幾個網站的來源,我發現他們通過使用腳本標記來加載廣告,該標記注入DOM中的東西,併發出AJAX調用來加載和填充廣告。如何確定這一切何時完成?

(通過任何異步替換的例子,我想,我只是想不出什麼比上述更普遍的。)

通過「檢測」,我的意思是,在任何方式可能。例如,將一些JS代碼注入頁面,將某些內容寫入頁面以讓我知道所做的事情。或者例如用QtWebkit,JS可以調用C++(我相信),所以JS片段可以調用C++函數來讓它知道頁面何時「加載」。無論什麼作品,總之。

當前'天真'的實現,我剛剛坐着,並在加載一頁後等待幾秒鐘。這很傻。

請儘可能詳細,如果在理解答案之前需要更多背景信息,請隨時說'先閱讀'。

非常感謝!

回答

1

通常不可能說出包含異步腳本驅動內容的頁面是否真正完成加載。除了halting problem的基本問題之外,腳本或插件可以註冊週期性定時器事件,並可以無限期地繼續修改或添加到頁面。

我通常看到的用於確定何時完成頁面加載的方法是當整個DOM已經加載時,直接從該DOM引用的資源(圖像,樣式表,腳本等)已被加載,並且所有腳本代碼已被讀取並執行一次。通過document.write()發送的文本被視爲用於此目的,就好像它直接包含在源HTML中一樣。如果您使用的是QtWebKit,我相信這是您連接到信號QWebPage::loadFinished(bool)時會看到的行爲。通過計時器(您可以使用訪問page()得到一個QWebFrame所包含QWebPage。)

遞延行動由腳本代碼設置,是否在等待其他資源的加載事件來完成,或者你有什麼,是不是計算;媒體播放器和其他插件可能會使事情進一步複雜化,因爲每種媒體類型甚至播放器對於「已加載」的內容可能具有不同的標準。

許多最近的JavaScript庫都利用這種行爲,通過加載一個不完整的頁面來提高感知頁面的加載時間,該頁面只包含第一個屏幕的內容加上一些腳本,而實際上並沒有開始加載圖像和內容「直到第一個screenful完成後才完成加載和渲染。不過,對於自動化工具,抓取工具或那些認爲JavaScript可以被信任站點獲得特權的用戶來說,這並不是非常友好。

+0

使用loadFinished(bool)似乎並不能保證所有腳本至少執行過一次。只是資源已被下載。 – 2010-11-11 08:29:34

+0

你如何定義「所有腳本已經執行」?任何加載了'

相關問題