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