为什么我不能让Javascript与ActionScript交谈

时间:2010-02-09 13:32:02

标签: javascript flash actionscript externalinterface

我有一个非常简单的播放音乐的flash程序。它由一个播放暂停按钮和一个显示歌曲当前位置的计时器组成。我正试图使用​​常规表单按钮暂停或播放歌曲。

<div class="musicplayer_playpause">
            <script type="text/javascript">
            AC_FL_RunContent( 'codebase','http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0','width','65','height','68','src','player','quality','high','pluginspage','http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash','wmode','transparent','id','flashobject','movie','player','flashvars','id=<?=$cur_songid;?>&type=<?=$_GET["type"];?>&csid=<?=$cur_songid;?>&l=<?=$Arrcntt+1;?>"' ); //end AC code
            </script><noscript><object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" id="flashobject" width="65" height="68">
              <param name="movie" value="player.swf" allowscriptaccess="always"/>
              <param name="quality" value="high" />
              <param name="wmode" value="transparent" />
        <param name="id" value="flashobject" />
        <param name="swliveconnect" value="true" />
              <embed src="player.swf" name="flashobject" width="65" height="68" quality="high" allowscriptaccess="always" pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" wmode="transparent" swliveconnect="true" ></embed>
          </object>
          </noscript></div>

这是Javascript函数,我将其放在以下部分:

<script type="text/javascript">
function Pause() {
var flash =  document.getElementById('flashobject');
flash.PlayPause;
}
</script>

最后这是我正在使用的按钮:

<form>
<input type="button" value="Play" name="Play" onClick="Pause();"> 
</form>

当我点击按钮时,Firefox的错误控制台显示“Flash为空”我做错了什么?

4 个答案:

答案 0 :(得分:3)

我认为这不是您问题的直接解决方案,但我从经验中知道使用

var flash =  document.getElementById('flashobject');
flash.PlayPause;

在所有流行的浏览器中都不会显示相同的行为。您可以尝试使用以下函数返回对象:

function thisMovie(movieName) {
  if(navigator.appName.indexOf("Microsoft") != -1) {
    return window[movieName];
  } else {
    return document[movieName];
  }
};
thisMovie('flashobject').PlayPause();

但是,如果您使用的是jQuery,则会执行以下操作:

$("#flashobject")[0].PlayPause();

编辑:我找到了更新版本的thisMovie函数。我仍然会推荐jQuery方式:)

function getFlashMovieObject(movieName){
  if(document.embeds[movieName])
    return document.embeds[movieName];
  if(window.document[movieName])
    return window.document[movieName];
  if(window[movieName])
    return window[movieName];
  if(document[movieName])
    return document[movieName];
  return null;
}

答案 1 :(得分:1)

包含暂停的脚本标记格式错误。在type属性中添加一个尾随引号。

此外,AC_FL_RunContent未定义电影的ID。再添加4个参数 - 'id','flashobject','name','flashobject'。

此Adobe技术说明http://kb2.adobe.com/cps/127/tn_12701.html中描述了AC_FL_RunContent,其中说明了这一点:

  
      
  • id(对象的属性,仅对象)
      电影标识符。标识主机环境的Flash影片(a   例如,网页浏览器)   可以使用脚本引用   语言。
  •   
  • 名称(仅限嵌入)   电影   名称。标识Flash影片   主机环境(Web浏览器,   通常)这样它可以   使用脚本语言引用   例如JavaScript或VBScript。
  •   

答案 2 :(得分:0)

找到这个:<param name="movie" value="player.swf" allowscriptaccess="always"/> 替换为

 <param name="movie" value="player.swf" />
   <param name="allowScriptAccess" value="always" />

我仍然会使用Jasper的功能

答案 3 :(得分:0)

Jasper拥有正确的JavaScript方法,但您还需要add callbacks来获取ActionScript中的JS函数,以便AS知道如何监听它们。

AS代码:

import flash.external.ExternalInterface;
ExternalInterface.addCallback("PlayPause", playPauseMovie);
...
function playPauseMovie():void {
   //code goes here
}