な訳で、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