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