FB 1.5.0及其以上:
1. js可以调 JSAPI的Methods, Properties, Attributes, and Events;
2. Properties
在 ue3dwebAPI.h的构造函数里加这个:
// Read-write property
registerProperty("testString",
make_property(this,
&ue3dwebAPI::get_testString,
&ue3dwebAPI::set_testString));
// Read-only property
registerProperty("version",
make_property(this,
&ue3dwebAPI::get_version));
其中对应的方法是:
// Read/Write property testString
std::string ue3dwebAPI::get_testString()
{
return m_testString;
}
void ue3dwebAPI::set_testString(const std::string& val)
{
m_testString = val;
}
js的调用代码是:
document.getElementById("btn_testsetvalue").onclick = function() {
try{ var strvalue= document.getElementById("txt_setvalue").value;
if(plugin().valid){
plugin().testString = strvalue;
} else {
alert("Plugin is not working :(");
}
} catch (e) {
alert("btn_testsetvalue出错:\n" + e.name + ":" + e.message)
}
};
3. Methods
在 ue3dwebAPI.h的构造函数里加这个:
registerMethod("echo", make_method(this, &ue3dwebAPI::echo));
registerMethod("testEvent", make_method(this, &ue3dwebAPI::testEvent));
在ue3dwebAPI.cpp里实现函数:
FB::variant ue3dwebAPI::echo(const FB::variant& msg)
{
static int n(0);
fire_echo("So far, you clicked this many times: ", n++);
// return "foobar";
return msg;
}
void ue3dwebAPI::testEvent()
{
fire_test();
}
在js里调用:
document.getElementById("btn_highlight").onclick = function() {
try{
var modelid= document.getElementById("txt_modelid").value;
if(""!=modelid){
if(plugin().valid){
alert(plugin().echo("This plugin seems to be working!"));
} else {
alert("Plugin is not working :(");
}
}
} catch (e) {
alert("btn_highlight:\n" + e.name + ":" + e.message)
}
};
document.getElementById("btn_testevent").onclick = function() {
try{
if(plugin().valid){
plugin().testEvent;
} else {
alert("Plugin is not working :(");
}
} catch (e) {
alert("btn_testgetvalue出错:\n" + e.name + ":" + e.message)
}
};
4. Event
注意:所有字母小写,以on开头,如 onload onstart ondead onsomethingelse。
注意:永远不要在析构函数中触发事件(fire event),这样会导致未定义的行为,也许会使得页面重新加载的时候插件崩溃!
声明语法:FB_JSAPI_EVENT({事件名(不带on)}, {参数个数}, {参数类型列表})
比如:
class ue3dwebAPI : public FB::JSAPIAuto
{
public:
FB_JSAPI_EVENT(echo, 2, (const FB::variant&, const int));
};
在ue3dwebAPI.cpp的某些函数中触发这个事件如下:
FB::variant ue3dwebAPI::echo(const FB::variant& msg){
static int n(0);
fire_echo("So far, you clicked this many times: ", n++);
// return "foobar";
return msg;
}
在js中使用:
首先写事件的实现函数:
function onPluginUpdate(num) //对应update事件,参数为一个int类型
{
alert("number is " + num);
}
然后要注册这个事件(注意不同浏览器的区别):
function registerEvent()
{
var plugin = document.getElementById("pluginID");
if(plugin.attachEvent) //IE, 或者是判断浏览器内核
{
plugin.attachEvent("on" + "load", onPluginLoad);
}
else
{
plugin.addEventListener("load", onPluginLoad, false);
}
}