0

C++コードにイベントハンドラーを追加したいと思います。

firebreath.org(スクリプトからのコールバック)のドキュメントをフォローしました:

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で「InspectElement」を使用すると、「EventListeners」で「load」に新しいリスナーが追加されていることがわかります。ただし、listenerBodyは<JSAPI-Auto Javascript Object>です。

これがmine::foo()が呼び出されない理由であると思います。これは関数ではなく、オブジェクトであるため、Javascriptはそれを呼び出す方法を知りません。

誰かがこれを成し遂げる方法を知っていますか?

私が考えることができる別の方法は次のとおりです。

  1. カスタムイベントハンドラーを登録する
  2. initでカスタムイベントを起動します

次のようなものを使用したいと思います:

registerEventMethod("myevent", &mine::foo);

myeventが発生したときに、mine :: foo()を呼び出すことができるようにします。

ここでの質問は、mine :: fooはJSObjectPtrではないため、このコードスニペットは機能しません。

この場合、registerEventMethod()を使用する適切な方法は何ですか?

4

1 に答える 1

0

registerEventObjectは、実際には手動で呼び出されることを意図したものではありませんでした。これは、addEventListenerおよびattachEventの内部実装によって使用されます。目的は、プラグインのイベントにjavascriptハンドラーをアタッチすることです。

Boostのシグナルやスロットなどを使用して、独自のc++側のイベントシステムを実装することをお勧めします。FireBreathのものは、その問題を解決することを意図したものではありませんでした。一方、それを見たい場合は、FireBreathの機能を拡張してそれをサポートすることはおそらく可能であり、FireBreathのゲートキーパーがおそらくその目的のためにプルリクエストを楽しませるという非常に良い権限を持っています。=]

于 2012-06-20T13:02:58.760 に答える