2011年10月3日月曜日

【備忘録】 AIRのHTMLLoaderは画面に表示しなくても使える

AIRをFlexスタイルで開発している、、、んだけど、世の中にはJavascriptの有用なライブラリがいっぱいあって、ActionScriptにはない、からJavascriptの部分だけ使いてーよー。という場合。

Javascriptを処理させるにはHTMLLoaderにJavascript(を含むHTML)ソースを食わせると良い。

HTMLLoader君は画面表示のための機能がいろいろあったりする(HTMLLoaderはDisplayObjectContainerを継承している)ので、表示しないと使えないかと思いきや、実はnewして、URLをloadさせてあげるだけでJavascriptは実行される。ナイス。

当然、AS側からコントロールできないと意味ないのでブリッジを作ってやる必要があるのだが、それもごく簡単。

AS側からJS関数を叩くなら、
var html:HTMLLoader = new HTMLLoader;
(・・・load・・・とか)
(completeイベント以降で)
html.windows.someJsFunc(x,y,z);
とかやるだけ。要はhtml.windowがJS側のグローバルスコープそのものになっている。
(ので、おなじみのgetElementByIdもAS側から呼べるぞ)

一方JS側からAS側の関数をコールバックさせたいなら、
var html:HTMLLoader = new HTMLLoader;
(・・・load・・・とか)
(domInitializeイベント以降で)
html.windows.someJsFunc = someAsFunc;
とかやっておけばよろしい。html.windowはリードオンリーではなく、オブジェクトの注入も可能だ。
JS側でsomeJsFuncを叩くと、AS側のsomeAsFuncが呼ばれる仕組み。

散々公式ドキュメント読んだんだけど、全然わからなくて泣いた。
上のを知ってからHTMLLoader.windowの説明を読むと「あ、そういうことですか」と合点が行くのだが・・・。

0 件のコメント: