OpenLaszlo内のscriptでブラウザ側のJavaScriptを呼び出すために_root.getURLを実行しているわけですがIEだと挙動がおかしい。
まず一番初めのgetURLは有効に動く(ように見える)。
次のgetURLの呼び出しはまともに動いてくれない。つまりjavascriptは実行されない。
んで3度目のgetURLはIEのアドレスバーの部分にgetURLで指定した引数が表示されブラウザは真っ白に。
javascript:setLocationHash(decodeUTF8('cbn_3Db2_26cqk_3D_5FE3_5F81_5F84_5FE3_5F81_5F84_5FE3_5F81_5F84'));void(0);
気になったんで調べてみるとonbeforeunloadイベントが発生しているということで
fscommandか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だけども広範囲につかえるようだ。今まで苦労って一体・・
他のもこのあたりが参考になります。
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側のオブジェクト、第三引数がそのメソッド。
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