6

私の単純な ActionScript JavaScript が Flash オブジェクトのメソッドを呼び出せるように、 Flash のExternalInterfaceを使用してコールバックを設定しようとしています。Safari、Firefox、および IE ではすべて正常に動作しますが、Chrome を動作させることができません。Chrome でコードを試すと、次のエラーが表示されます。

キャッチされていない TypeError: オブジェクト #<an HTMLObjectElement> にはメソッド 'setText' がありません

これが私が使用している HTML の例です (ここでも、Safari、FF、および IE で正常に動作します)。

<html><body>
<div id="mycontent"></div>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"></script>
<script type="text/javascript">
swfobject.embedSWF("http://invincible.dynalias.com:8080/HelloWorld.swf", "mycontent", "400", "420", "9.0.0","expressInstall.swf", {}, {allowScriptAccess:'always'},{id:'hw',name:'hw'});

function getFlash(movieName) {
   return ( navigator.appName.indexOf("Microsoft") != -1) ? window[movieName] : document.getElementById(movieName);
}
</script><p>
  <input type="text" id="exampleText" /> <input type="button" value="Set Text" onclick="getFlash('hw').setText(document.getElementById('exampleText')
.value)" />
</body>
</html>

ここにActionScriptがあります...

package {
  import flash.display.Sprite;
  import flash.text.TextField;
  import flash.external.ExternalInterface;
  import flash.system.Security;

  public class HelloWorld extends Sprite {

    private var textField:TextField = new TextField();
    public function HelloWorld() {
      Security.allowDomain("*");
      ExternalInterface.addCallback("setText", this.setText);
      textField.text = "Hello, world!";
      addChild(textField);
    }   
    public function setText(text:String):void {
      this.textField.text = text;
    }   
  }
}
4

5 に答える 5

13

私はそれが競合状態であることにロブソンに同意しますが、それは「Flashタグを書く」ことではなく、タイマーを追加することは良い解決策ではありません-実際には非常に危険です.

問題は、SWF 自体が読み込まれておらず、外部インターフェイスを初期化する機会があったことです。Chrome の小さな SWF の場合、タイミングは他のブラウザーよりも敏感かもしれませんが、根本的な問題は Chrome に固有のものではありません。

あなたがする必要があるのはこれです:

アクションスクリプトで

コンストラクターからこの関数を呼び出します。

public function InitializeExternalInterface():void 
{   
      if (ExternalInterface.available) {

           // register actionscript functions so they can be called by JS   
           ExternalInterface.addCallback("activate", activate);
           Security.allowDomain("www.example.com");     

           // send message to parent page that SWF is loaded and interface active
           trace("External Interface Initialized...");
           ExternalInterface.call("flashInitialized")
      }
      else 
      {
          trace("ERROR: External Interface COULD NOT BE Initialized...");
      } 
}

あなたのHTMLで

 <script>

     function flashInitialized() 
     {
         alert("Initialized!");      // remove this obviously!
         $('#Main')[0].activate();   // safe to call Flash now
     }

 </script>

ローカル マシンでは、これがなくても機能することに気付くかもしれませんが、ネットワーク遅延を方程式に追加するとすぐに、これを行わなかったことを後悔するでしょう。接続が遅い場合でもエラーが発生するため、任意のタイマーはお勧めできません。このメソッドにより、ページはできるだけ早くフラッシュ オブジェクトを呼び出すことができます。


注: jQuery の「準備完了」パターンを使用することは、問題の解決策ではありません - 最初はそれを 1 つと間違えましたが。

$(function() 
{
   $('#animation')[0].SetTitle("Hello"); 
} 

また、swfobject'scallbackFnもソリューションではありません。これは、SWF がロードされたときではなく、タグが挿入されたときに通知するだけだからです。

于 2011-03-14T02:30:58.940 に答える
3

私はExternalInterface、Firefox、Chromeに問題があり、Adobe ScriptがFlashタグを十分な速さで書き込んでいないことを発見しました。そのため、ブラウザーがaddCallback()関数を見つけようとしたときに、その関数はありませんでした。

Flashで作成されたaddCallback()を呼び出すJavascript関数をwindow.setTimeout()呼び出しに配置するだけで、問題が解決します。200ミリ秒未満の遅延でも、問題が発生します。

document[FlashId]オブジェクトに「length」属性が存在するかどうかを確認するソリューションを使用する必要はありませんでした。「FlashEmbed=document [FlashId]」を呼び出すだけで、問題なく機能しました。

于 2009-12-08T14:58:52.353 に答える
3

JavaScriptとフラッシュの間でリスナーイベントを起動して受信するという同じ問題が発生しました。

解決策は、JQuery フラッシュの代わりに Adob ​​e のAC_OETags.jsファイルを埋め込みスクリプトとして使用することでした。(これは、クライアント側の検出の下にある zip ファイルにあります。アドビでは、おそらく他の場所にもあると思われます)

フラッシュがブラウザで JavaScript コールバックを構築するときの競合状態に基づく問題。これは、何らかの理由でストレート埋め込みでは正しく処理されません。

<div>
<script>
// Major version of Flash required
var requiredMajorVersion = 10;
// Minor version of Flash required
var requiredMinorVersion = 0;

var hasRequestedVersion = DetectFlashVer(requiredMajorVersion, requiredMinorVersion, requiredRevision);
AC_FL_RunContent(
"src", "tagflash",
    "width", "200",
    "height", "200",
    "id", "myTagFlash",
    "quality", "high",
    "bgcolor", "#FFFFFF",
    "name", "myTagFlash",
    "allowScriptAccess","always",
    "type", "application/x-shockwave-flash",
    "pluginspage", "http://www.adobe.com/go/getflashplayer",
    "flashvars", "templateData=theYear:2010&theTagNumber:123"
);
</script>
</div>

次に、次のことができます:(IE、FF、Safari、Crome、++で動作します)

$("#tagFlash").gotoNewFrame();
于 2011-04-18T10:51:41.743 に答える
0

かなり苦労した後、最終的に Adob​​e の公式ソリューションを使用することにしました。

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/external/ExternalInterface.html

を検索しExternalInterfaceExample.asます。

于 2012-01-24T21:55:13.390 に答える
0

Chrome の組み込みフラッシュ プラグインを無効にすることで、この問題を回避できます。

  1. クロムのアドレスバーに chrome://plugins と入力します。
  2. 右上隅の詳細をクリックして、プラグインの詳細を展開します。
  3. 「Adobe Flash Player」のエントリで、最初のものを無効にします。

これは解決策ではありませんが、これが Chrome で発生する理由を示しています。Chrome にはフラッシュ プラグインが組み込まれているため、AS3 の ExternalInterface を使用するときにしばしば問題が発生し、面倒です。

于 2013-08-15T08:56:14.623 に答える