2009-07-30 103 views
2

我主持WebBrowser控件,這通常加載外部文件,然後使得使用HTML DOM一些修改。WebBrowser控件:檢測導航故障

我們還嵌入如使用假協議自定義應用程序的鏈接,「關閉此」被抓住並BeforeNavigate2處理。

當鏈路tarket拼寫錯誤(比如, 「屬:CloseWindow」),BeforeNavigate不會觸發自定義處理。瀏覽器控件不顯示的導覽樹狀圖的錯誤,但仍保留在READYSTATE_INTERACTIVE並且不火NavigateCompleteDocumentComplete


我的問題: 大多數操作(例如檢索或更新的內容)被延遲和等待readyState的到達READYSTATE_COMPLETE。點擊這樣無效的鏈接後,瀏覽器不會再更新 - 這是我想避免的狀態。 我該怎麼做?

  • 我可以在「DownloadComplete」中檢測到導航失敗嗎? (這樣我就可以放鬆了測試"READYSTATE_COMPLETEREADYSTATE_INTERACTIVE and last downloadComplete was broken「)
  • 我可以‘重置’瀏覽器控件READYSTATE_COMPLETE(可能不是)
  • 我能檢測通過瀏覽器實際支持pseudoprotocols?

(事後看來,使用xxxx:前綴是不是一個好主意,但是改變,現在是有點問題的。)

回答

5

Internet Explorer和Windows有urlmon.dll中實現可用的協議的可擴展列表,我相信,看這裏有點ab out IE architecture

不能檢測BeforeNavigate壞協議的原因是,該協議是未知的,所以沒有真正的導航正在發生的事情。瀏覽器決定顯示錯誤頁面。錯誤頁面導航並不明顯引發所有正常事件。

然而,有一種方法,當導航在雜草已經被檢測到。如果您連接到Web瀏覽器的DocumentCompleted事件,則可以掃描與錯誤相關的特定URL,或者更一般地,掃描以res://ieframe.dll開頭的URL。

例子:

  • RES://ieframe.dll/unknownprotocol.htm#spp:CloseWindow
  • RES://ieframe.dll/dnserrordiagoff_webOC.htm# http://192 ...

更簡潔的方法是掛入DWebBrowserEvents2 interface的NavigateError。

0

我們託管的時候在一個Web瀏覽器控件(谷歌地圖),我們會通知導航完成(NavigateComplete),但是網頁本身並沒有完成呈現出了毛病。爲了解決這個問題,我們添加了一個notifyInitialised JavaScript函數,該函數簡單地導航到'app:// onInitialised' - 一種您正在使用的類似機制。

也許你可能是這樣的東西(如果你可以控制用戶導航到的頁面)。您可以添加此通知機制並在您的代碼中檢查它。如果在規定的超時後沒有收到,您​​可以假設出現問題並顯示相關消息。

如果您有興趣,我們還使用了一種機制,直接從我們描述的C++代碼herehere中調用javascript函數。