ホームページ >ウェブフロントエンド >jsチュートリアル >SWF 関数への JS アクセスの使用例_JavaScript スキル
この記事の例では、SWF にアクセスするための JS の関数の使用法について説明します。皆さんの参考に共有してください。具体的な分析は次のとおりです。
Flash と JS が相互に呼び出している例は数多くありますが、これは問題ではありません。もちろん、Flash と JS の間の非互換性の問題は、今日、完全に解決されます。 !
Flash では、外部 JS 関数にアクセスする場合、
JS に Flash の関数にアクセスさせたい場合は、addCallBack でコールバック関数を登録し、JS にそれを呼び出させる必要があります (AS2 の例)
import flash.external.*; var methodName:String = "SetImgPath"; //JS需要调用的函数名字 var instance:Object = null; var method:Function = extractstr; //Flash中实际的函数名字,参数忽略,但是你调用的时候要记得有参数的要加上 var wasSuccessful:Boolean = ExternalInterface.addCallback(methodName, instance, method); trace(wasSuccessful+"-callback")
この時点で true であれば、登録は成功したことになります。
OK、以下のウェブで試してみてください:
<div style="margin-left:50px; margin-bottom:50px"><input type="text" id="mytxt" border="1" value="这是测试框,调用页面JS演示" style="width:200px"/></div> <div id="flashContent"> <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="515" height="320" id="123" align="middle"> <param name="movie" value="123.swf" /> <param name="quality" value="high" /> <param name="bgcolor" value="#000000" /> <param name="play" value="true" /> <param name="loop" value="true" /> <param name="wmode" value="transparent" /> <param name="scale" value="showall" /> <param name="menu" value="true" /> <param name="devicefont" value="false" /> <param name="salign" value="" /> <param name="allowScriptAccess" value="sameDomain" /> <!--[if !IE]>--> <object type="application/x-shockwave-flash" data="123.swf" width="515" height="320"><!--下面针对非IE内核浏览器--> <param name="movie" value="123.swf" /> <param name="quality" value="high" /> <param name="bgcolor" value="#000000" /> <param name="play" value="true" /> <param name="loop" value="true" /> <param name="wmode" value="transparent" /> <param name="scale" value="showall" /> <param name="menu" value="true" /> <param name="devicefont" value="false" /> <param name="salign" value="" /> <param name="allowScriptAccess" value="sameDomain" /> <!--<![endif]--> <a href="upload/2011/1/201101281000491420.gif" alt="获得 Adobe Flash Player" /> </a> <!--[if !IE]>--> </object> <!--<![endif]--> </object> </div>
OK、このフラッシュコールを呼び出すためのボタンを Web に追加します。 c42b73b81f1c4c8f24f6771b4c1e83b2
テストしてみましょう:
IE6、7、8、9 ではすべて正常に動作します
FF: 失敗しました
クロム: 失敗しました
失敗の原因: SetImgPath は関数ではありません /未定義です)
これは非常に奇妙です。アラートを使用して出力できます。
出力結果は Null ではありません。これは Flash が見つかったことを意味しますが、FF と Chrome が常に関数を見つけられないのはなぜですか?
さまざまなフォーラムを閲覧した結果、登録が成功する前に addCallback をフラッシュでロードする必要があるというのがコンセンサスです。では、ロードが成功したかどうかを判断するために settimeout 関数を追加しましょう。
function flashcall(str){ try{ thisMovie("123").SetImgPath(str);//注意,123是上面的ID,而SetImgPath是我们Flash中的注册的回调函数 }cache(e){ settimeout("flashcall(str)",100 ); } }
そうですね、settimeout を使用し、100 ミリ秒ごとに呼び出します。例外が発生した場合は、成功するまで呼び出し続けます。
残念ながら、成功することはなく、プログラムは無限ループに入りました!
さまざまな情報を調べた結果、最終的にその理由がわかりました。
FF のブラウザは埋め込みタグのみを認識するため、getElementById を使用してフラッシュを取得する場合は、埋め込みに ID をタグ付けする必要があります。そのため、IE はオブジェクトに ID をタグ付けする必要があります。 🎜>
FF と Chrome では、Flash は ID を識別するために embed を使用する必要があり、Object タグは ID を識別できないことがわかりました。私が使用している Html は Flash によって自動的に生成され、すべて Object タグです。 、これは有害です。午後にデバッグを行った後、問題がここにあることに気付きました。理由がわかったので、ラベルを変更するのが簡単になります。
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" width="515" height="320" id="123" title="123" align="middle"> <param name="allowScriptAccess" value="always" /> <param name="movie" value="123.swf"> <param name="quality" value="high"> <param name="wmode" value="transparent" /> <embed src="123.swf" name="123" quality="high" allowScriptAccess="always" swLiveConnect="true" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="515" height="320"></embed> </object>
この記事が皆様の JavaScript プログラミング設計に役立つことを願っています。