2011-10-26 9 views
1

JavaScriptからActionScript内の関数を呼び出そうとしていますが、別のフラッシュファイルでこれを正常に実行できましたが、現状では何らかの理由で失敗しています。私は、これは私のJSコードで、jQueryのSWFEmbedを使用しています:ExternalInterfaceコールバックが機能しません

$.ajax({ 
     url: '<?php echo $html->url(array('controller' => 'voicenotes', 'action' => 'get_url'), true);?>' + '/' + container.children('#VoicenoteVnid').val(), 
     dataType: 'json', 
     type: 'POST', 
     success: function(response) { 
      container.children('.voicenote-info').children('.player').addClass('active'); 
      flashMovie = container.children('.voicenote-info').children('.player'); 
      alert(flashMovie.html()); 
      flashMovie.flash({ 
      swf: '<?php echo $html->url('/files/flash/reproductor_compact.swf',true); ?>', 
      width: 240, 
      height: 40, 
      quality: "high", 
      wmode: "transparent", 
      allowscriptaccess: "always", 
      }); 
      alert($('.player.active > object')[0].callIt()); 
     }    
     }); 

そして、ここでは私のASコードがあり、これは私のコンストラクタである:

public function reproductor() 
     { 
      ExternalInterface.addCallback("callIt", test); 
      ExternalInterface.call("alert", "Que fue?"); 
      trace(ExternalInterface.available); 
     } 

そして、これは私の関数である:

private function test():String { 
      return "this is a test"; 
     } 

ExternalInterface.callが動作し、トレース出力が真の場合、何が起こっているのかわかりません。

P.S:ExternalInterfaceコールバックにパラメータを渡す方法を教えていただけたら、私はそれを感謝します。

+0

$('.player.active > object')[0].callIt("LOLSOME") ... ExternalInterface.addCallback("callIt", test); private function test(arg:String):String { return "param received from JS: " + arg; } 
下記[スタックオーバーフローの答え(http://stackoverflow.com/questions/7657842/how-to-call-flash-actionscript-callback-method-from-javascript/7657994# 7657994)には、特定の問題の原因となる可能性があります。 –

答えて

2
  1. あなたのSWFオブジェクトを見つけるためのJqueryセレクタが間違っている可能性があります。 を別の方法で試してみてください。ちょうどデバッグ用ですか?
  2. SWFが完全に読み込まれる前にAS3関数を呼び出していることがあります。なぜ、その関数呼び出し(callIt)をAjaxの外部のボタンに置​​き、アラートが呼び出された後にそれを押してみませんか?

ちょうどJSで送信、コールバック関数内のparamを受信し、コールバック関数の引数としてそれを受け取るために。 例:

+0

はい、これは問題のようです。あなたのSWF上でJSから関数を呼び出す前に、SWFをインスタンス化し、コードブロックの 'ExternalInterface.addCallback'メソッドを実行する必要があります。 JSメソッドを利用できるようにすぐに呼びたい場合は、SWF内で 'addCallback'が実行されるとすぐにメソッドを起動できます。これは、DOMがFlashと対話するオープンゲームなので長い間、allowScriptAccessが有効になっています – gthmb

+0

これは問題です、Marceloさん、ありがとうございます。この方法は、再生したい.mp3ファイルのURLをロードすることです(これはオーディオプレーヤーです)。 flashvarsはうまく動作しますが、次のプレイに行くときに1つのファイルを再生すると、キャッシュからプレーヤーが取得され、最初に再生されたファイルが再生されるため、ExternalInterfaceコールが再生されます。あなたはアイデアを持っています。私のサイトにはボイスノートのストリームがあり、プレーするためにクリックするたびに、そのプレイヤーがインスタンス化されます。 – 8vius

+0

@ 8vius、なぜあなたの問題をより良く説明しないのですか?私はそれを得ていない。 あなたは曲を呼び出す方法を持っていて、JSを介してそれらを呼び出すことができます。優先的には、ただ1つのSWFを使用します。 –

関連する問題