2011-04-05 28 views
4

Awesomium很容易允许C++代码调用Javascript方法,但我还没有找到明确的答案,如果它可以做相反的事情。 This site似乎可以说,你可以,但通过文字和例子看并不开导我。因此,我正在寻找一个明确的答案:我可以在我的Javascript(jquery)中调用C++变量/方法,还是不?Awesomium是否允许我在JS中调用/使用C++变量/方法?

如果你可以包括一个简单的例子,那也将非常感激。

谢谢!

回答

14

你当然可以 - 你只需要使用委托/函数指针在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时写了它。

+0

为了简单起见,上面的代码只映射基于回调名称的函数 - DelegateMap的typedef实际上应该是std :: map ,JSDelegate >为一对对象名称+回调名称。 – Adam 2011-04-07 03:13:09

+0

谢谢,这绝对是一个很好的答案。你付出了很多努力。即使这不会最终为我工作,我仍然会对这个主题有更好的理解。 – Briz 2011-04-07 13:46:31

+0

没问题,很高兴帮助。 :-) – Adam 2011-04-07 16:59:54

相关问题