2013年06月13日

JS側からAIR側にHTMLLoaderでデータを送るメモ

本当はしっかり書くつもりだったけど、誤って投稿前にデータ吹っ飛ばしてしまったので、モチベダウンでメモレベルに。

BackSpaseをブラウザバックにするのは、textareaとの相性最悪だと思うんですがそこんとこどうなんですかねぇ??


HTMLLoader氏、addEventListenerで登録できるイベントはこちら。

・htmlDOMInitialize
・complete
・htmlBoundsChanged
・locationChange
・locationChanging
・scroll
・uncaughtScriptException

また、JS側からwindow.runtime.htmlLoaderが呼べるとかいうことを書いてる文献もあるけど、うちの環境(FlashDevelopでAIR×AS3)ではloadメソッドで呼び出したものにはwindow.runtimeが存在しないと言われ怒られる。

loadScriptであれば出来ないことはないんだけど、JS側から任意のタイミングでAIR側の特定のイベントを発動させたい!っていう要望はかなえられないので、非常に困ってました。


この解決方法を思いついたのでメモなのです。

@AIR側でhtmlLoaderにlocationChangingのイベントを定義する。
AlocationChangingの中で、引数のevent.locationのURL引数に、「AIRSendData=○○」というパラメーターが含まれていないかどうかを見る。ぶっちゃけAIRSendDataという部分の名前は何でもいい(後述)
B-1AIRSendDataが含まれていたら、そのデータの内容に応じて、switch文等で分岐させ、それぞれのメソッドを実行させるようにする。その後event.preventDefault();を実行して、URL遷移を阻止する(←重要)
B-2AIRSendDataが含まれていなければ、event.preventDefault();を実行せずに、通常通りのURL遷移をさせる
CJavaScript側で、AIRのイベントを発動させたいときは、window.location.searchのURL引数に「"?AIRSendData=○○"」を代入すれば、代入した瞬間に、○○の値に応じたイベントが、B-1のswitchで分岐したとおりに動く
D見事JS側からAIRに任意のタイミングにイベントを送りつけることに成功。


こんな流れです。LocationChangingEventの穴を突いたような方法です。結構思いつくまで時間がかかった。
上記の内容を読めばわかると思いますが、AIRSendDataは、JS側とAIR側で共通した特定のパラメータ名であれば何でもいいのですが、まあ分かりやすく、かぶりにくい名前ということで採用しただけです()

また、別にURL引数は1つしか送れないというわけではないので、イベントの分岐キー(switch)として、「AIRSendKey=○○」を送り、命令に関するデータを「AIRSendData=××」みたいに、2つのURL引数を送るようにしてもいいかもしれませんね。
posted by がお at 07:14| Comment(0) | ActionScript | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

×

この広告は1年以上新しい記事の投稿がないブログに表示されております。