JavaScriptからフラッシュに簡単なテストメッセージを送信しようとしていますが、エラーが発生します:
Object #<HTMLObjectElement> has no method "listenToJS"
スタックでこれに関するいくつかの質問を読みましたが、ブラウザーがフラッシュオブジェクトへの適切な参照を取得していないか、アクションスクリプト内でフラッシュ機能を適切な場所に配置していないように感じます。
したがって、html内にSWFObjを使用してフラッシュを埋め込みます。
<div id="flash_content">
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="1280" height="800" id="tourFlash" name="pano" class="pano">
<param name="movie" value="VRDemo.swf" />
<param name="menu" value="false" />
<param name="wmode" value="transparent" />
<param name="allowscriptaccess" value="always" />
<!--[if !IE]>-->
<object type="application/x-shockwave-flash" data="VRDemo.swf" width="1280" height="800" class="pano">
<param name="menu" value="false" />
<param name="wmode" value="transparent" />
<param name="allowscriptaccess" value="always" />
<param name="allownetworking" value="all" />
<param name="flashvars" value="zoom=null&pan=null&sound=null" />
<!--<![endif]-->
<a href="http://www.adobe.com/go/getflashplayer">
<img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" />
</a>
<!--[if !IE]>-->
</object>
<!--<![endif]-->
</object>
</div>
<script>
var flashObj;
$(document).ready(function(){
flashObj = document.getElementById('tourFlash');
$('#interface').click(function(){
console.log('click');
talkToFlash();
});
});
function talkToFlash(){
flashObj.listenToJS('hello from js');
}
function listenFromFlash(flashMessage){
console.log(message);
}
</script>
クリックハンドラーがトリガーされますが、ここでエラーが発生します。私のフラッシュファイルはドキュメントクラスを使用しており、ドキュメントクラス内にはパブリック関数があります。Flashは次のように構成されています。
package com.company.vr {
import flash.display.*;
import flash.events.*;
import com.greensock.*;
import com.greensock.easing.*;
import flash.external.ExternalInterface;
import flash.system.Security;
Security.allowDomain("*");
public class VR_TestDocument extends MovieClip {
public function VR_TestDocument() {
ExternalInterface.addCallback("talkToFlash", listenToJS);
}
public function listenToJS(message){
trace ("from js: " + message);
var flashMessage = message + " flash";
ExternalInterface.call("listenFromFlash", flashMessage);
}
}
}
- -アップデート - -
外部インターフェースが何らかの理由でSWFObjectを好まないようです。この例でFlashが使用した埋め込み方法に切り替えると、次のようになります。
動作しますが、フラッシュを埋め込むにはswfobjectが最適な方法だと思います。誰かアイデアがありますか?