我想在我的C ++代码中添加一个事件处理程序。
我在firebreath.org(Callback from Scripts)中跟踪了文档:
FB::JSObjectPtr doc = m_host->getDOMDocument()->getJSObject();
doc->Invoke("addEventListener", FB::variant_list_of("load", FB::make_callback(this, &mine::foo)));
但看到以下错误:
/home/dq/manager/mine.cpp: In member function ‘void mine::init()’:
/home/dq/manager/mine.cpp:284:119: error: no matching function for call to ‘variant_list_of(const char [5], FB::JSAPIPtr)’
/home/dq/manager/mine.cpp:284:119: note: candidates are:
/usr/include/firebreath/ScriptingCore/variant_list.h:122:5: note: FB::detail::VariantListInserter FB::variant_list_of(FB::variant)
/usr/include/firebreath/ScriptingCore/variant_list.h:122:5: note: candidate expects 1 argument, 2 provided
/usr/include/firebreath/ScriptingCore/variant_list.h:128:5: note: FB::VariantList FB::variant_list_of()
/usr/include/firebreath/ScriptingCore/variant_list.h:128:5: note: candidate expects 0 arguments, 2 provided
In file included from /home/deqing/manager/mine.h:51:0,
from /home/deqing/manager/mine.cpp:37:
/usr/include/firebreath/ScriptingCore/JSCallback.h: In function ‘FB::JSAPIPtr FB::make_callback(const T&, F, bool) [with T = mine*, F = void (mine::*)(), FB::JSAPIPtr = boost::shared_ptr<FB::JSAPI>]’:
/home/dq/manager/mine.cpp:284:118: instantiated from here
/usr/include/firebreath/ScriptingCore/JSCallback.h:47:107: error: request for member ‘get’ in ‘instance’, which is of non-class type ‘mine* const’
/usr/include/firebreath/ScriptingCore/JSCallback.h:49:97: error: request for member ‘get’ in ‘instance’, which is of non-class type ‘mine* const’
make[2]: *** [CMakeFiles/mine.dir/manager/mine.cpp.o] Error 1
make[1]: *** [CMakeFiles/mine.dir/all] Error 2
make: *** [all] Error 2
查看make_callback()的实现,我试着改为:
FB::JSObjectPtr doc = m_host->getDOMDocument()->getJSObject();
doc->Invoke("addEventListener", FB::variant_list_of("load")(FB::JSAPIPtr(new FB::JSCallback(FB::make_method(this, &mine::foo)))));
这次编译通过,但我的函数 - mine :: foo()没有用document.load()调用
通过在chrome中使用“Inspect Element”,在“Event Listeners”中我可以看到为“load”添加了一个新的监听器。但是,listenerBody是<JSAPI-Auto Javascript Object>
。
我担心这就是为什么没有调用我的:: foo(),Javascript不知道如何调用它,因为它不是一个函数,只是一个对象。
任何人都知道如何完成这项工作?
我能想到的另一种方式是:
我想使用类似的东西:
registerEventMethod("myevent", &mine::foo);
这样当myevent被触发时,可以调用我的:: foo()。
这里的问题是,我的:: foo不是JSObjectPtr,所以这段代码不起作用。
在这种情况下使用registerEventMethod()的正确方法是什么?
答案 0 :(得分:0)
registerEventObject实际上从未打算手动调用;它由addEventListener和attachEvent的内部实现使用。目的是将javascript处理程序附加到插件中的事件。
我建议你使用boost的信号和插槽来实现你自己的c ++端事件系统; FireBreath的东西从来没有打算解决这个问题。另一方面,如果你想看一下它可能会扩展FireBreath的功能来支持它,并且我有非常好的权限,FireBreath的看门人可能会接受拉动请求。 =]