- 2009年3月19日 23:51
- Progression
非ProgのものをProg化するテストで、ExternalInterfaceを使ってJS通信するサンプルを加工してみました。
で、エラーが起こりまくるので頑張ってデバグしてみると、いろいろ見えてきたのでメモメモ。
ぶっちゃけブログパーツなんですが、
1.本体パーツをクリック
2.オーバーレイFlashが表示される
3.オーバーレイの閉じるボタンをクリック
4.オーバーレイ削除&本体パーツも表示mc変更
という流れのもので、3→4の流れでつまづいていました。
オーバーレイFlashの閉じるボタンの部分:
close_btn.addEventListener(MouseEvent.CLICK,closeFunc)
function closeFunc(e:MouseEvent):void{
ExternalInterface.call("endFunc");
}
JSの部分:
function endFunc(){
var player = document.all ? window["overlayID"] : document["overlayID"];
player.FlashCallBack();
window.setTimeOut(function(){
document.getElementByTagName("body")[0].removeChild("overlay_flash");
},1);//オーバーレイを画面から消すときはsetTimeOutを使った方がよさげなので
}
本体パーツFlash:
ExternalInterface.addCallBack("FlashCallBack","endFunc2");
function endFunc2():void{
mc1.visible=true;
mc1.gotoAndStop("BlogPartsEnd");
}
という、どうってことのない流れなんですが、FlashCallBackをコールするとエラーが起こりました。
uncaught exception: Error calling method on NPObject!
[plugin exception: Error in Actionscript.Use a try/catch block to find error.]
これ、ググって見るとセキュリティを満たしていないからだ、という記事が多々出てきたんですが、それだけじゃなさそうです。セキュリティについては、当然、Flash側もJS側もちゃんと書いてあります。念のためクロスドメインXMLも置きました(今回は関係ないのかな)。
//Flash
Security.allowDomain("*")
Security.loadPolicyFile("http://example.com/crossdomain.xml")
//JS(SWFObject)
bp_so.addparam("allowScriptAccess","always")
でもエラーが出ます。
uncaught exception: Error calling method on NPObject!
[plugin exception: Error in Actionscript.Use a try/catch block to find error.]
どうやらコレ、AS側にエラーがあると全部この表示になっちゃうっぽいです。
なので、AS側の処理をひとつずつ見ていくと、どこでつまづいているのかが分かります。
ExternalInterface.addCallBack("FlashCallBack","endFunc2");
function endFunc2():void{
//ここでmc1の参照がうまくいってないのでは、と考えたので
//mc1があるかどうかをチェックします
mc1 = getChildByName("test_mc")
return mc1
//mc1.visible=true;
// mc1.gotoAndStop("BlogPartsEnd");
}
mc1を返すようにしてみると、null でした。どうやらmc1が分からないまま処理を続けようとしてエラーになってるぽいですね。
でもProgressionじゃない版ではこの書き方で大丈夫でした。
ということは、Progのシーン(testScene)内にあるmcを見つけられてないっぽいなぁ、と思ったので
ExternalInterface.addCallBack("FlashCallBack","endFunc2");
function endFunc2():void{
return testScene
}
にしてみると、これまたnull でした。どうやらこのCallBackを定義している場所からtestSceneを参照できてないっぽいので、TestScene.as内に書いてみると、
「Object obj__19」
どうやら参照が通ったみたいです。
念のため
ExternalInterface.addCallBack("FlashCallBack","endFunc2");
function endFunc2():void{
return testScene.mc1.toString()
}
と書いてみると、「mc1」と出ました。これでOK。なので最終的には
ExternalInterface.addCallBack("FlashCallBack","endFunc2");
function endFunc2():void{
testScene.mc1.visible =true;
testScene.mc1.gotoAndStop("BlogPartsEnd");
}
これにて一件落着ですね。
- Newer: MTを3.35→4.25にアップデート
- Older: PVをページビューじゃなくイベントカウントとして使うアクセス解析の提案
Comments:0
Trackbacks:0
- TrackBack URL for this entry
- http://ryow.net/mt/mt-tb.cgi/407
- Listed below are links to weblogs that reference
- ProgressionでExternalInterfaceを使ってみる from ryow.net Blog