--edit/quetz: 如果你有在頁面的JavaScript不是運行在所有的問題:一定要檢查,我已經張貼在http://social.msdn.microsoft.com/Forums/en-AU/jscript/thread/bac9f056-e0de-449e-a1b6-36e745fa59c6的主題我的發現 - 也許你的問題都涉及到一些不幸的時機或財產製定者排序。事實證明,如果您在XAML中對URL進行硬編碼,那麼您必須確保在該XAML中IsScriptEnabled在SOURCE屬性之前設置,否則根據您的頁面的doctype的類型會有很多失敗。這同樣適用於在代碼中設置Source或Navigate,但在那裏很明顯。另一方面,乍一看,綁定似乎無論哪種方式正常工作。 - /編輯
很長一段時間,因爲你張貼過去了,但如果你仍然有問題在你的記憶,那麼也許它會幫助你一點。
讓我們首先想想淺度:
也許該頁面尚未加載?你說所有的頁面都在ISO上,所以它們在眨眼之間加載,但仍然需要一些時間。您只需指出Navigate()方法,這對我來說有點奇怪,因爲InvokeScript()最重要的是,在接收導航事件事件之後或之後調用它。雖然你可能有它正確實施,你可能沒有正確輸入導航中的事件與導航() - 但根據你寫的,你也可以一直在努力做的事情:
void myfuntion()
{
webbrowser.Navigate("pages/index.html");
webbrowser.InvokeScript("myjsfunc");
}
這將幾乎從不工作。實施它的正確方法是:
...
//elsewhere
webbrowser.Navigated += wb_Navigated;
...
void myfuntion()
{
webbrowser.Navigate("pages/index.html"); // or webbrowser.Source = ...
}
void wb_Navigated(object sender, NavigationEventArgs e)
{
webbrowser.InvokeScript("myjsfunc");
}
只有這樣您才能確定頁面已加載。沒有它,你幾乎可以保證失敗。
但是,在這種情況下,您可能會得到一個0x80020101 hresult。
當JS引擎遇到符號時,至少在7.0,7.1和7.5 sdk版本中使用這個函數,這個問題還沒有得到理解。這個錯誤也會在其他許多情況下報告,但這是最常見的。每當你嘗試調用包含未定義名稱的東西時 - 你會看到0x80020101。例如,InvokeScript(「eval」,「askdjaslkdsajdla」)會拋出,假設這個變量不是用來欺騙這個例子:)
我在寫這篇文章,因爲如果你沒有對Navigated過早地進行調用,那麼內存頁面可能仍舊是舊內容的舊頁面,因此您嘗試調用的名稱可能會丟失。但是,如果你真的看到80020006(這是名稱未知但來自OLE層),那麼我會假設問題在別處。然後,我們有每當你嘗試導航的事件處理程序中調用一個InvokeScript深入挖掘..
,那麼你可能(從我的經驗,至少)的bug在秋天受害者到一個很隨意網頁瀏覽器。簡單地說:有時,儘管接收到「導航」通知,但WebBrowser實際上還沒有處於完全準備/呈現/跆拳道狀態。
我不知道什麼時候,我想它連接到頁面大小,腳本大小/時間,或外部鏈接的資源量。
當發生這種情況時,您將觀察除0x80020101以外的ComException,並且我幾乎可以確定它將是80020006.簡單InvokeScripts(如「eval」,「mom」)可能會正確執行並運行,但更多它越複雜,機會越小。例如,當它發生時,全部腳本直接指向主體元素或其子元素 - 在解析該元素時將立即失敗。如果你使用像jQuery這樣的庫 - 你可能不會事件引用明確聲明的主體 - 如果庫觸及它,它將以同樣的方式失敗,同樣的異常。奇怪的是,document.head不受問題的影響,你可以參考它沒有問題。根據我的觀察,在這種情況下只有身體是有問題的。
其實,寫作,經過 - 我看可能你的情況可能是完全一樣的,當你試圖修改「document.body.style.fontSize」 ..
不管怎麼說,有沒有瞬間解決問題的方法,因爲問題出現在網頁瀏覽器的內部時間點,並且恰好在報告「導航」過早。我確定這是一個可怕的網頁瀏覽器中的錯誤,也許他們將在未來的版本中修復。在此之前,處理它的唯一方法是......延遲調用,直到瀏覽器真正完成解析頁面爲止。
要說起來,換句話說: 如果你想正確地調用InvokeScript在browser.Navigated處理程序中,你可能會得到一個異常不同比0x80020101(這將意味着給InvokeScript你的js代碼是不良形成)。如果你發現這個錯誤(可能是80020006),那麼檢查你是否可以通過invokescript'觸摸'document.body。如果你得到不同的錯誤,那麼情況就不是這樣。但是,如果你得到了同樣的錯誤,那麼很可能就是這種情況,而問題在於你或者瀏覽器的運氣不好。你必須放棄你的嘗試,啓動一個125..500毫秒的計時器,從處理程序返回,這樣瀏覽器將被允許繼續其內部工作,然後,當計時器過去時 - 重試原始調用並祈禱。在延遲嘗試期間,您還必須以相同方式監聽異常情況,因爲您可能會再次發生同樣的錯誤,並再次發生(...)。
從我的實驗來看,在這種情況下500ms總是足夠的,但對於用戶體驗來說卻是醜陋的。 125是相當不明顯的,但是 - 然後 - 有時它太快了,並且必須完成2-3次重試。
但是,無論發生什麼 - 一旦您導航,接收導航,然後成功觸摸document.body - timingerror將從來沒有再次發生,爲該頁面。一旦內部瀏覽器的齒輪運行,InvokeScript就會像魅力一樣工作,直到你加載下一頁爲止;;)
根據我的經驗,如果你可以控制頁面的原始來源,你也可以嘗試簡單一點的解決方法 - 在你的頁面,在身體,某處:
<script type="text/javascript"> window.external.notify('somestringyouwillknow'); </script>
,並在C#或XAML代碼,重視WebBrowser.ScriptNofity事件。只要你的頁面加載,它就會調用ScriptNotify併爲你提供你寫在那裏的字符串。它肯定會在Navigated事件之後到達,並且如果你捕獲到這樣的ScriptNotify通知 - 很明顯JS引擎已經加載並且正文至少部分被解析,並且很可能document.body將被初始化並且可觸摸。
「導航到其他網站」和「所有的HTML文件都存儲在獨立存儲」?你怎麼可以導航到其他網站,但仍然保存所有的HTML在孤立的存儲? – AnthonyWJones 2011-04-18 19:43:19
安東尼 - 是不是在不同的基地/目錄內的ISO上有不同的網站/頁面是不可能的? – quetzalcoatl 2011-10-06 15:07:28
當調用的函數中存在javascript錯誤時,會發生此錯誤。 – Charlie 2012-07-27 14:55:58