Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在Awesomium中从JavaScript调用应用程序方法吗?_Javascript_Awesomium - Fatal编程技术网

我可以在Awesomium中从JavaScript调用应用程序方法吗?

我可以在Awesomium中从JavaScript调用应用程序方法吗?,javascript,awesomium,Javascript,Awesomium,我在网上搜寻答案,但我一定是问错了问题。我有一个带有Awesomium web控件的C#winforms应用程序。我能从加载页面的javascript调用应用程序中定义的方法吗?如果是,怎么做?(非常感谢示例js代码)。谢谢 在C++中:(.NET绑定可能类似) 定义回调类: class TestListener : public Awesomium::WebViewListener { public: virtual void onCallback( Awesomium

我在网上搜寻答案,但我一定是问错了问题。我有一个带有Awesomium web控件的C#winforms应用程序。我能从加载页面的javascript调用应用程序中定义的方法吗?如果是,怎么做?(非常感谢示例js代码)。谢谢

在C++中:(.NET绑定可能类似)

定义回调类:

class TestListener : public Awesomium::WebViewListener {
public:
    virtual void onCallback(
        Awesomium::WebView* caller,
        const std::wstring& objectName,
        const std::wstring& callbackName,
        const Awesomium::JSArguments& args
    ) {
        if (objectName == L"myApi" && callbackName == L"doMagicFoo") {
            cout << "callback called with " << args.size() << " args\n";
        }
    }

    //...implement all the other pure virtual functions...  
};
然后在HTML/JS中:

<button onclick="myApi.doMagicFoo('super', 45)">do native call</button>
执行本机调用

方法取决于您使用的Awesomium版本。在即将发布的1.7版(目前为1.7RC3)中,这一点的实现方式和之前的实现方式都有了一些变化。请注意,1.7中有一个改进,即.NET方法现在可以在JS调用应用程序上的方法时返回值。我认为这在1.7之前是不可能的

以下是两种方法:

test.html(用于两个版本)

版本1.6

Form.cs

public Form1()
{
    InitializeComponent();

    //webView is an instance of WebControl defined in your form
    webView.DomReady += WebViewOnDomReady;

    webView.Source = new Uri("test.html");
}

private void WebViewOnDomReady(object sender, EventArgs eventArgs)
{
    webView.DomReady -= WebViewOnDomReady;

    webView.CreateObject("jsobject");
    webView.SetObjectCallback("jsobject", "callNETNoReturn", JSHandler);

    webView.ExecuteJavascript("myMethod()");

    var result = webView.ExecuteJavascriptWithResult("myMethodProvidingReturn('foo')");
    Console.WriteLine(result.ToString());
}

private void JSHandler(object sender, JSCallbackEventArgs args)
{
    Console.WriteLine("Got method call with no return request");
}
对于较新版本

从JavaScript调用:

webControl1.LoadingFrameComplete += LoadingFramecompleted;

public void LoadingFramecompleted(object sender, FrameEventArgs e){
    //after loading complete create global object
    JSObject obj = webControl1.CreateGlobalJavascriptObject("jsobject");
    obj.Bind(myMethod);
}

private JSValue myMethod(object sender, JavascriptMethodEventArgs e)
{
    MessageBox.Show("hello world");
    return "My response";
}
内部JavaScript

jsobject.myMethod(); //myMethod is the method name defined in c#
调用JavaScript

webControl1.ExecuteJavascript("SayHello()");

Bind现在已不推荐使用。我们可以更新这个答案以反映更新的版本吗?@Dagrooms,我不再使用Awesomium。我已经转向开源的替代方案,CEFSharp(github.com/CEFSharp/CEFSharp)。首先,与冬虫夏草不同,它对所有商业用途都是免费的。更重要的是,Awesomium的当前版本(1.7.5)在Chromium 18上运行,在HTML5测试中得分很低(html5test.com上555分中有335分)。CEFSharp使用Chromium 39运行,在HTML5测试中得分更高(html5test.com上555分中有470分)。对于那些仍然使用Awesomium的用户,请随时编辑我的答案或发布您自己的答案。
webControl1.LoadingFrameComplete += LoadingFramecompleted;

public void LoadingFramecompleted(object sender, FrameEventArgs e){
    //after loading complete create global object
    JSObject obj = webControl1.CreateGlobalJavascriptObject("jsobject");
    obj.Bind(myMethod);
}

private JSValue myMethod(object sender, JavascriptMethodEventArgs e)
{
    MessageBox.Show("hello world");
    return "My response";
}
jsobject.myMethod(); //myMethod is the method name defined in c#
webControl1.ExecuteJavascript("SayHello()");