2011-03-25 97 views
9

這個錯誤似乎拋出任何出錯的JavaScript函數被調用:爲什麼WP7 WebBrowser InvokeScript調用拋出錯誤:80020101?

SystemException was unhandled  
An unknown error has occurred. Error: 80020101. 

我使用的JavaScript作爲一個web應用程序後端的接口,我正在工作的兩個電話細,裝,從一個Ajax調用,看起來像這樣的返回JSON:

在Silverlight:

MyBrowser.InvokeScript("getData", "/Me/Feed?numberOfResults=-1", "MyFeed"); 

的JavaScript加載到web瀏覽器

function getData(url, context) { 
    $.ajax({ 
     url: url, 
     dataType: 'jsonp', 
     success: function (result) { 
      callback(result, context); 
     } 
    }); 
} 

但後來我想張貼數據傳回服務器,我做同樣的事情:

MyBrowser.InvokeScript("postData", "thedata", "CreatePost"); 

function postData(payload, context) { 
    $.ajax({ 
     type: "POST", 
     url: "/Post/Create?" + tz(), 
     data: payload, 
     dataType:"json", 
     success:function (result) { 
      callback(result, context); 
     } 
    }); 
} 

現在我得到的異常。

真奇怪的是,我可以立即從腳本內調用該函數,並將其發佈到後端就好了。

postData("sampledata", "PostTest"); 

起初它似乎是唯一的區別在於一個是GET,另一個是POST,所以我複製的GET AJAX調用到第二個呼叫(這發生在用戶輸入,其中,第一個發生在加載)。結果是一樣的(我得到相同的錯誤)。只要它不包含Ajax調用(它會出現),我可以從此事件獲取其他命令以在JavaScript中觸發。所以你可能會認爲這是一個計時的事情 - 所以我把上面的調用移到了我稱之爲正在工作的其他InvokeScripts的地方,但它仍然不起作用(同樣的例外)。

我也試着在一個單獨的線程上調用它,使用Dispatcher.BeginInvoke進行測量並且沒有骰子。

Dispatcher.BeginInvoke(() => 
{ 
    MyBrowser.InvokeScript("postData", "thedata", "CreatePost"); 
}); 

我完全感到困惑。看起來似乎有一定的一致性,因爲如果一次呼叫失敗,它每次都會失敗,但是我不能分辨出工作的呼叫和失敗的呼叫之間有什麼區別。

任何人都可以告訴我我做錯了什麼,或者我不明白關於使用InvokeScript和Ajax?

謝謝!

[編輯 - 添加此內嵌(在評論),因爲我得到這個問題很多]

我已經在此工作了6小時,這是我所看到的:

  • 有2個不同的事件,我正在進行這些調用; 1)當瀏覽器控件上的頁面加載完成時,2)當用戶點擊我的「發佈」按鈕
  • 當Ajax調用是來自加載事件的GET時,錯誤不會發生
  • 錯誤會發生從調用用戶事件相同的GET呼叫時
  • 調用使用POST從負載事件Ajax調用時,錯誤也會確實發生
  • 調用不從用戶試圖在所有Ajax功能時,不會發生錯誤事件
+0

它是否使用自然XMLHTTPRequest執行此操作? – mattsven 2011-03-25 04:02:13

+0

調用InvokeScript時頁面是否完全加載?可能是$ .ajax函數尚未加載? – 2011-03-25 04:45:11

+0

嗨,NeXXeuS - 我不確定我明白你在暗示什麼。你的意思是我應該嘗試使用JavaScript作爲Web應用程序的界面並直接訪問它?主要的原因是,我的團隊不想僅僅爲這個客戶端重寫所有的東西,另一件事是這種方法提供了現有的Facebook身份驗證功能,並避免了所有跨域Silverlight問題 – Subcreation 2011-03-25 12:13:55

回答

3

看到GET使用JSONP,而POST根本不工作,似乎意味着你可能要跨域?通常在同一個域上,不需要使用JSON * P *。

所以我的猜測是,它是違反同源策略的

+0

是的,事實證明,雖然我的網頁與服務位於同一個域,但我從其他地方加載了JavaScript,並創建了跨域的情況。謝謝,丹! – Subcreation 2011-03-25 21:23:05

6

如果Java中出現80020101錯誤腳本方法無法找到或th JS引發錯誤。

就查找方法而言,控件將完全匹配簽名。這不是標準的JavaScript行爲,所以要小心這一點。

請注意在瀏覽器控件中緩存頁面(及其內容),因爲這會吸引很多人。 :(

+0

謝謝,馬特。這也是我的理解 - 但您可以在我的示例代碼中看到函數名稱和簽名是相同的; 「postData」,取2個參數。我知道頁面緩存 - 我在每次測試之前清除它。 – Subcreation 2011-03-25 12:19:05

+0

@Nathan Roberton更改方法的內容以確定問題所在。讓'postData'做一些肯定能夠確保它不是互操作問題的東西。它也可能是一個jQuery的問題,因爲它不AFAIK完全支持IE7Mobile。 – 2011-03-25 12:40:44

+0

謝謝,馬特 - 我已經爲此工作了6個小時,這就是我所看到的: - 有兩個不同的事件可以讓我進行這些調用; 1)當瀏覽器控件上的頁面加載完成時,2)當用戶點擊我的「發佈」按鈕 - 當Ajax調用是來自加載事件 的GET時,錯誤不會發生 - 調用時會發生錯誤來自用戶事件 的相同GET調用 - 在加載事件 中使用POST調用Ajax調用時也發生錯誤OCCUR - 調用不會從用戶事件嘗試任何Ajax的函數時不會發生錯誤。 – Subcreation 2011-03-25 16:23:23

0

我只是固定了類似的問題

這是一種奇怪的...它需要:。 1.傳遞參數給javascript函數作爲一個逗號分隔字符串 2.使用split()解析JavaScript中的字符串 3.創建表達式的字符串(即函數調用帶參數) 4.對字符串表達式執行eval()。

我想你也可以將一個字符串傳遞給一個javascript數組。

湯姆

0

唯一的問題(如我所面臨的相同),因爲這樣的事實,你的Web瀏覽器控件不加載和JavaScript函數被調用。

正如其中一個答案,它已被指出。