4

我创建了一个新的 WPF 项目,并向其中添加了Awesomium 1.6.3 WebControl

然后,我将此代码添加到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”,然后是“function (a,b){...}”,现在我考虑了一下,这是不正常的,但无论如何,这是另一个问题。

一旦我取消注释底部代码,它就会警告“1”然后挂起。为什么?我怎样才能获得有关页面上链接的一些信息?或者可靠地将一些信息传递回 C#?或者使用 C# 访问 DOM?

编辑: jQuery只是一个包含 jQuery 1.7 代码的字符串。

4

2 回答 2

5

关于以下行挂起的原因:

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

这是因为ExecuteJavascriptWithResult只能返回基本的 Javascript 类型(字符串、数字、布尔值、数组或用户创建的对象)。您尝试返回无法映射到这些类型之一的本机 DOM 元素对象,因此请求失败。

于 2011-11-11T05:41:27.787 回答
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包含在序列化内容中可能是有利的。)

于 2015-12-05T16:04:15.670 回答