« IEでのJavascriptのエンコーディグエラー | main | ふと思ったんですが »

2005年03月28日

JavaScript から Flashを制御する(超クロスブラウジング編)

オケラとかサッパリとか言う名前の駄目ブラウザ達のせいで、イマイチ実用的でなかったJavaScript → Flash間通信(逆は一応動く)。

モダンブラウザを全てサポートして、無理やり可能なことが発覚。
さぁ、奥さん。これは買わなきゃ損ですよ!!

用意するものは、swfファイル2つとhtmlファイル2つ。
ロジックは以下の通り。

1.htmlAにある、swfAに対して値を送りたい。
2.JavaScriptでIFrameに、swfBを持つhtmlBをロードする。
3.htmlBの生成時に swfBのobjectタグに、送信したい値をflashVarsで書き込む
4.値を受け取ったswfBはローカルコネクション(LC)を作成、LC経由でswfAに値の通知を行う。
5.swfAは無事に値を取得!

まさに、Flash beyond the Ajax!!これなら変数どころか、関数だって呼びだせますよ!WIN/MAC, オケラやサッパリのようなゴミブラウザだって安定して動きますとも。
1ヶ月リサーチした甲斐があったってもんです。


以下注意点

LCは1対1通信しか(たしか)できない
恐らく普通にやると、同じページを2つ開くと片方は動きません。よってhtmlAを生成時に、世界時間等をユニークIDとしてflashAに埋め込む必要があります。innerHTMLをリロードするときに、このIDを渡してやればページを2つ開いても別IDの通信となる為に、衝突は回避できます。

命令にレスポンスがかかる
複数の命令を同時に発行できない
IFrameをリロードするという手法上、変数が伝達されるまでに、恐らく0.1秒ほどタイムラグがあります。この為for文内での連続呼び出しなどを行うことはできません。感覚としては超高速なサーバー間通信というニュアンスでコールバックベースで行うのがいいと思います。

また当たり前ですがリロード中に新しい命令を投げると、古い命令が消されてしまいます。複数の命令を同時に送りたい場合は複数のIframeを用いるか、命令のスタッキングの仕組みを作る必要がありそうです。

これでようやっとAjaxと同じ土俵で戦えそうです。というかFlashの弱点のほとんどを(超気合いれれば)克服できる。やたー。

あとは誰かフレームワーク作って配布してください。


<追記>
書いてる最中に、同じようなこと2年前に思いついてる人を発見してショックを受ける。でもまぁ、LCの衝突を克服したんでいいってことで。

投稿者 Taka : 2005年03月28日 07:58

book

dotfla.gif

bookmark

はてなブックマークに追加

del.icio.usに追加

trackbacks

this entry's trackback URL:
http://www.fladdict.net/cgi-bin/mt3/mt-tb.cgi/14

このリストは、次のエントリーを参照しています: JavaScript から Flashを制御する(超クロスブラウジング編):

» JavaScriptからFLASHへデータを送る from WEBサイト研究ブログ
FLASHからJavaScriptを扱うのは手法的に有名かと思いますが、JavaScriptからFLASHへデータを送る手法は案外知っている人は少ないかも…..... [read more]

トラックバック時刻: 2005年09月28日 22:36

» http://presidentchoicefinancial-hajg.blogspot.com from http://presidentchoicefinancial-hajg.blogspot.com
http://economicsandenvironment-nKqL.blogspot.com [read more]

トラックバック時刻: 2006年03月04日 01:23

» affordable health insurance from affordable health insurance
Their costs the [read more]

トラックバック時刻: 2006年03月07日 11:08

» life insurance from life insurance
life insuranc... [read more]

トラックバック時刻: 2006年03月24日 12:54

comment

初めまして。Flashの通信について非常に興味があったので、ブログを読ませていただきました。
1つ質問なのですが、「4.値を受け取ったswfBはローカルコネクション(LC)を作成、LC経由でswfAに値の通知を行う。」
ローカルコネクションは同ドメインでないと無理ですよね?

別ドメインでの場合は、window.statusとかclipboardとかがいいかもしれないですね。

それにしても面白いブログですね。非常に勉強になります。また来ます!

by kenji : 2005年04月05日 20:23

えーと、ひょっとして、こうさぎの中の方ですか!?
実はXMLRPCの実戦投入にひっそり感動してました。

例えば、別ウィンドウの別ドメインの情報を取得・・・ということでしょうか。ちょっと意味がつかめてないのですいません。検討違いかもしれませんが・・・

LCの通信は、LCクラスのallowDomainという関数をオーバーライドすることで、ドメイン間通信が可能となります。のでサービス系だったらば、ユーザー登録時に許可ドメインとかをDBに保存すればいけるんじゃないでしょうか。あるいはコンフィング.xmlとか作るとか。

>それにしても面白いブログですね。
ありがとうございます!というか、むしろ僕が勉強させていただいてます。これからもヨロシクお願いします。

by Taka : 2005年04月06日 06:16

いえ、こうさぎの者ではないです。すみません^^;
ただ同業者というか同じようにブログに貼り付けるパーツなどの開発をしているものです。

確かに、こうさぎのXMLRPCの導入はビックリしました。自分でもやろうとしてみましたが、ちょっと断念しました。。

> LCの通信は、LCクラスのallowDomainという関数をオーバーライドすることで、ドメイン間通信が可能となります。

なるほど、allowDomainですね。忘れていました。。参考になります。ありがとうございました!

by kenji : 2005年04月07日 16:05

>いえ、こうさぎの者ではないです。すみません^^;
あー、すいません。凄く勘違いしてました(汗。リンク先のエントリーの署名が「こうさぎ太郎」になっていたので・・・ あれエージェントの名前だったのですね。

チャットのほうも完成したら凄く面白そうですね。期待してます!


by Taka : 2005年04月08日 06:22

コメントしてください




保存しますか?