な訳で、ExternalInterfaceを調べてみる
ってことでまず概要。ActionScript2.0ってことでSwf8なのね。
Windows 用 Internet Explorer の全サポートバージョン (5.0 以降)。 Flash Player ActiveX コントロールを埋め込むデスクトップアプリケーションなどの埋め込みカスタム ActiveX コンテナ。 NPRuntime インターフェイスをサポートする全ブラウザ。現時点では、以下のブラウザが含まれます。 Firefox 1.0 以降 Mozilla 1.7.5 以降 Netscape 8.0 以降 Safari 1.3 以降
Flash8だけども広範囲につかえるようだ。今まで苦労って一体・・
http://livedocs.macromedia.com/flash/8_jp/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00001599.html
他のもこのあたりが参考になります。
JavaScript Integration in Flash 8
http://www.communitymx.com/content/article.cfm?cid=0922A
RegExp in Flash 8 using ExternalInterface
http://blog.deconcept.com/2005/08/29/regexp-flash-8-using-externalinterface/
ExternalInterface.availableでExternalInterfaceが利用できるかまず調べる。
OpenLaszloからJavaScriptを呼び出す場合はいたってシンプルでExternalInterface.callを使う。
ExternalInterface.callは第一引数に呼び出したいメソッドの名前、それ以降はそのメソッドに渡す引数を任意の数だけ並べとく。
ちなみにこの引数はURIエンコードしとかなきゃいけないってのは今までと同じ。
逆にJavaScriptからFlash内のメソッドを呼び出すにはFlash側でExternalInterface.addCallbackを使用する。
ExternalInterface.addCallbackの第一引数はJavaScript側が参照するメソッドの名前
第二引数がFlash側のオブジェクト、第三引数がそのメソッド。
グローバルな関数ならオブジェクトはNullでOKなのかな。
addCallback(methodName:String, instance:Object, method:Function) : Boolean call(methodName:String, [parameter1:Object]) : Object
ってことで簡単なサンプルを作ってみる。LZXがこんな感じ。
ExternalInterface.availableを調べてないのは手抜き。
<canvas width="300" height="200"> <script> flash.external.ExternalInterface.addCallback("laszlofunction",null,laszlofunction); function laszlofunction(param) { message.setAttribute("text",param); } </script> <simplelayout axis="y" /> <text id="message" resize="true" /> <button>call js <handler name="onclick"> flash.external.ExternalInterface.call("jsfunction","From Laszlo To JavaScript"); </handler> </button> </canvas>
でJavascriptのほうは。swfobject.jsを使用してます。
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>ExternalInterface Test Application</title> <script src="rcf/js/swfobject.js" type="text/javascript"></script> <script type="text/javascript"> function jsfunction(param) { document.getElementById('lzapp').laszlofunction(param+":From JavaScript To Laszlo"); } </script> </head> <body> <div id="flashcontent"> RichCart Application </div> <script type="text/javascript"> var obj = new SWFObject("extest.lzx.swf", "lzapp", "100%", "100%", "8", "#EEEEEE"); obj.addParam("swLiveConnect", "true"); obj.addParam("name", "lzapp"); obj.write("flashcontent"); </script> </body> </html>
だがうまくいかない・・・flashが未定義だとエラーが出力される。
ってことで再び検索の旅にでること5分くらいで原因が判明。
http://www.laszlosystems.com/developers/community/forums/showthread.php?s=&threadid=6138
私はLZXをコンパイルするときにLaszloデバッグコンソールを使っていて
swf8をラジオボタンで選択し、Compileボタンでコンパイルし、SOLOボタンでデプロイしていたんだけど
SOLOボタンで実際にコンパイルされるときのバージョンはラジオボタンではなくて
というファイルの最後のほうにある
WEB-INF\lps\config\lps.properties
というところが使われるそうだ。(んなアホな・・)
# Compiler parameters
compiler.runtime.default=swf7
ってことでswf8にしてデプロイしてやっと動きました!
いや・・もう一度言わせてください。今まで苦労って一体・・?
ってことで最後はサンプルで〆
http://www.asahi-net.or.jp/~ya5m-kwbr/externaltest/extest.html
http://www.asahi-net.or.jp/~ya5m-kwbr/externaltest/extest.lzx