2011-11-11 20 views
4

我創建了一個新的WPF項目,併爲其添加了一個Awesomium 1.6.3 WebControl如何使用Awesomium將JavaScript結果返回給C#?

然後,我加入此代碼MainWindow.xaml.cs

private void webControl1_Loaded(object sender, RoutedEventArgs e) 
    { 
     webControl1.LoadURL("https://www.google.com/"); 
    } 

    private void webControl1_DomReady(object sender, EventArgs e) 
    { 
     var wc = new WebClient(); 
     webControl1.ExecuteJavascript(jQuery); 
     webControl1.ExecuteJavascript(@"var __jq = jQuery.noConflict();"); 
     webControl1.ExecuteJavascript(@"alert(__jq);"); 
     using(var result = webControl1.ExecuteJavascriptWithResult(@"(function() { return 1; })();")) 
     { 
      MessageBox.Show(result.ToString()); 
     } 
     //using (var result = webControl1.ExecuteJavascriptWithResult(@"(function() { return __jq('a'); })();")) 
     //{ 
     // MessageBox.Show(result.ToString()); 
     //} 
    } 

它提醒 「1」,然後 「功能(A,B){...}」,這是不按順序,現在我想,不過,這是另一個問題。

只要取消註釋底部代碼,它會提示「1」,然後掛起。爲什麼?我怎樣才能獲得關於頁面上鍊接的一些信息?或可靠地將一些信息傳回C#?或者用C#訪問DOM?

編輯:jQuery只是一個包含jQuery 1.7代碼的字符串。

回答

5

至於爲什麼以下行掛起:

webControl1.ExecuteJavascriptWithResult(@"(function() { return __jq('a'); })();") 

這是因爲ExecuteJavascriptWithResult只能回到基本的JavaScript類型(無論是字符串,數字,布爾值,數組或用戶創建的對象)。您嘗試返回無法映射到其中一種類型的原生DOM元素對象,因此請求失敗。

+0

將是很好,如果它至少是拋出一個異常,並作了解釋。我想我仍然可以挑選出我想要的屬性,並將其作爲字符串返回,我猜。謝謝你的幫助! – mpen

+0

另外,什麼是用戶創建的對象,它與jQuery對象有何不同? – mpen

+1

這是一個錯誤,它應該立即返回null。我將它添加到我們的待辦事項列表中。 – Adam

1

返回複雜對象的簡單方法是使用JSON.stringify()轉換爲字符串,然後在C#託管代碼中解析出來。

例如:

JSValue rawToken = browser.ExecuteJavascriptWithResult(@"JSON.stringify(someTokenObjectHere);"); 
if (rawToken.IsString) 
{ 
    // For generic objects: 
    JObject payload = JObject.Parse(rawToken.ToString()); 
    // For typed objects: 
    MyCustomTokenObject payload = JsonConvert.DeserializeObject<MyCustomTokenObject>(rawToken.ToString()); 
} 

(這可能是有利的包括Newtonsoft.Json的序列化的東西。)

相關問題