ホームページ  >  記事  >  ウェブフロントエンド  >  SWF 関数への JS アクセスの使用例_JavaScript スキル

SWF 関数への JS アクセスの使用例_JavaScript スキル

WBOY
WBOYオリジナル
2016-05-16 15:51:52949ブラウズ

この記事の例では、SWF にアクセスするための JS の関数の使用法について説明します。皆さんの参考に共有してください。具体的な分析は次のとおりです。

Flash と JS が相互に呼び出している例は数多くありますが、これは問題ではありません。もちろん、Flash と JS の間の非互換性の問題は、今日、完全に解決されます。 !

Flash では、外部 JS 関数にアクセスする場合、

flash .external.ExternalInterface.call("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 は関数ではありません /未定義です)

これは非常に奇妙です。アラートを使用して出力できます。

コードをコピー コードは次のとおりです:
thisMovie ("123"):alert(thisMovie("123"));

出力結果は 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>

Flash に埋め込まれているタグを上記のものに変更すれば、すべて OK!

この記事が皆様の JavaScript プログラミング設計に役立つことを願っています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。