Awesomium很容易允许C++代码调用Javascript方法,但我还没有找到明确的答案,如果它可以做相反的事情。 This site似乎可以说,你可以,但通过文字和例子看并不开导我。因此,我正在寻找一个明确的答案:我可以在我的Javascript(jquery)中调用C++变量/方法,还是不?Awesomium是否允许我在JS中调用/使用C++变量/方法?
如果你可以包括一个简单的例子,那也将非常感激。
谢谢!
Awesomium很容易允许C++代码调用Javascript方法,但我还没有找到明确的答案,如果它可以做相反的事情。 This site似乎可以说,你可以,但通过文字和例子看并不开导我。因此,我正在寻找一个明确的答案:我可以在我的Javascript(jquery)中调用C++变量/方法,还是不?Awesomium是否允许我在JS中调用/使用C++变量/方法?
如果你可以包括一个简单的例子,那也将非常感激。
谢谢!
你当然可以 - 你只需要使用委托/函数指针在WebView :: setObjectCallback和WebViewListener :: onCallback之上构建一个额外的图层。
我写了一个快速JSDelegate.h类(view it here),您可以使用它将“onCallback”事件直接连接到C++成员函数。
的基本思路是保持回调的名字来代表一个映射:
typedef std::map<std::wstring, Awesomium::JSDelegate> DelegateMap;
DelegateMap _delegateMap;
从你WebViewListener调用相应功能:: onCallback:
void MyListener::onCallback(Awesomium::WebView* caller, const std::wstring& objectName,
const std::wstring& callbackName, const Awesomium::JSArguments& args)
{
DelegateMap::iterator i = _delegateMap.find(callbackName);
if(i != _delegateMap.end())
i->second(caller, args);
}
然后,每次希望绑定一个特定的C++函数,你会这样做:
// Member function we wish to bind, must have this signature for JSDelegate
void MyClass::myFunction(Awesomium::WebView* caller, const Awesomium::JSArguments& args)
{
// handle args here
}
// Instantiate MyClass instance in C++
MyClass* myClass = new MyClass();
// Create corresponding 'MyClass' object in Javascript
webView->createObject(L"MyClass");
// Do the following for each member function:
// Bind MyClass::myFunction delegate to MyClass.myFunction in JS
_delegateMap[L"myFunction"] = Awesomium::JSDelegate(myClass, &MyClass::myFunction);
webView->setObjectCallback(L"MyClass", L"myFunction");
然后,你应该能够直接从Javascript调用MyClass :: myFunction像这样:
MyClass.myFunction("foo", 1, 2 3)
希望这有助于!我没有测试任何代码,但是我在考虑Awesomium v1.6 RC4 SDK时写了它。
为了简单起见,上面的代码只映射基于回调名称的函数 - DelegateMap的typedef实际上应该是std :: map,JSDelegate >为一对对象名称+回调名称。 –
Adam
2011-04-07 03:13:09
谢谢,这绝对是一个很好的答案。你付出了很多努力。即使这不会最终为我工作,我仍然会对这个主题有更好的理解。 – Briz 2011-04-07 13:46:31
没问题,很高兴帮助。 :-) – Adam 2011-04-07 16:59:54