2011-04-18 78 views
4

我在WP7應用程序中使用WebBrowser控件並將IsScriptEnabled設置爲true。然後,當試圖通過WebBrowser的InvokeScript調用腳本時,我看到一個奇怪的行爲: 該腳本在第一頁上正確執行。然後,我通過Navigate()導航到另一個頁面,並嘗試執行腳本,我收到以下錯誤消息:嘗試在WebBrowser控件頁面導航後執行JavaScript時出錯

「發生未知錯誤,錯誤:80020006」。

我試圖在導航到下一頁之前將IsScriptEnabled設置爲true - 沒有運氣。等待完成文檔加載狀態也沒有幫助。

所有的HTML文件都存儲在獨立存儲中並正確顯示。只有腳本交互不起作用。

任何想法?

+1

「導航到其他網站」和「所有的HTML文件都存儲在獨立存儲」?你怎麼可以導航到其他網站,但仍然保存所有的HTML在孤立的存儲? – AnthonyWJones 2011-04-18 19:43:19

+0

安東尼 - 是不是在不同的基地/目錄內的ISO上有不同的網站/頁面是不可能的? – quetzalcoatl 2011-10-06 15:07:28

+1

當調用的函數中存在javascript錯誤時,會發生此錯誤。 – Charlie 2012-07-27 14:55:58

回答

1

由於未能執行所需功能,80020006可能出於各種原因顯示。通常,當功能無法找到時會遇到這種情況。
確保您正在加載包含該功能的文件的正確版本,而不是舊的緩存版本。
在手機上緩存可能非常具有侵略性,所以請不要假設您已加載最新版本的文件。如有疑問,請更改文件內容,以便您可以看到它是最新的/適當的版本。

更新
,因爲它似乎你試圖執行對已經瀏覽到你可能有相同的問題在http://social.msdn.microsoft.com/Forums/en-US/windowsphone7series/thread/e00942e4-e40c-4e80-b112-30ca0709fbc8/

記錄這也可能與網絡上任意網頁的代碼: http://social.msdn.microsoft.com/Forums/en-US/mktplace/thread/4ae5f139-f8b2-495b-860f-01075b735ee7/

+0

感謝您的答案,但我已嘗試重新啓動模擬器並清理解決方案,但沒有運氣。 我嘗試調用的腳本如下: 'string script = string.Format(「document.body.style.fontSize =(100 + {0} * 50)+'%';」,size); this.HtmlViewer.InvokeScript(「eval」,script);' 我試圖在每個頁面上將腳本嵌入到自己的函數中 - 也沒有成功。 – RalfE 2011-04-20 05:45:20

5

--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將被初始化並且可觸摸。

0

確保您所有的網頁都DOCTYPE標籤,像

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

我還發現,包括一段JavaScript代碼,甚至一對空的標籤以及幫助:

​​
+0

添加DOCTYPE標籤使它適用於我的情況。順便說一句,我使用調度程序允許在調用 'document.body.style.color ='blue'之前加載docuemnt;'' – FuZZbaLL 2013-11-29 14:13:55

0

我在以下三種情況下看到了此錯誤:

  1. 當頁面中的函數發生JavaScript錯誤時,您正在調用int O操作。嘗試在Chrome中調試頁面,特別注意檢查員。在調試過程中,您可能需要添加一些腳手架作爲C#代碼。
  2. WebBrowser控件未正確連接到XAML佈局時。例如,如果控件位於網格中,但沒有設置Grid.RowGrid.Column屬性或者它們超出範圍。
  3. 當使用WebBrowser.Loaded事件,而不是WebBrowser.LoadCompleted事件作爲觸發最終調用InvokeScript()
相關問題