Why can't I get Javascript to Talk to ActionScript
I have a very simple flash program that plays music. It consists of a play pause button and a timer that shows the current position of the song. I'm trying to make it possible to pause or play the song using a regular form button.
<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',开发者_如何学C'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>
Here's the Javascript function, which I put in the section:
<script type="text/javascript">
function Pause() {
var flash = document.getElementById('flashobject');
flash.PlayPause;
}
</script>
And finally here's the button I'm using:
<form>
<input type="button" value="Play" name="Play" onClick="Pause();">
</form>
When I click the button, Firefox's error console says "Flash is null" What am I doing wrong?
I don't think it's a direct solution to your problem, but I know from experience that using
var flash = document.getElementById('flashobject');
flash.PlayPause;
will not show the same behaviour in all popular browsers. you can try to use the following function to return the object:
function thisMovie(movieName) {
if(navigator.appName.indexOf("Microsoft") != -1) {
return window[movieName];
} else {
return document[movieName];
}
};
thisMovie('flashobject').PlayPause();
If you are using jQuery however, the following will do:
$("#flashobject")[0].PlayPause();
edit: I found a more updated version of the thisMovie function. I would still recommend the jQuery way though :)
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;
}
The script tag containing Pause is malformed. Add a trailing quote to the type attribute.
Additionally, AC_FL_RunContent is not defining an id for the movie. Add 4 more params to it - 'id', 'flashobject', 'name', 'flashobject'.
AC_FL_RunContent is described in this Adobe technote http://kb2.adobe.com/cps/127/tn_12701.html, which says this:
- id (attribute for object, object only)
Movie Identifier. Identifies the Flash movie to the host environment (a web browser, for example) so that it can be referenced using a scripting language.- name (embed only) Movie name. Identifies the Flash movie to the host environment (a web browser, typically) so that it can be referenced using a scripting language such as JavaScript or VBScript.
find this: <param name="movie" value="player.swf" allowscriptaccess="always"/>
replace with
<param name="movie" value="player.swf" />
<param name="allowScriptAccess" value="always" />
I would still use Jasper's function
Jasper has the right JavaScript method, but you also need to add callbacks for your JS functions in ActionScript, so that AS knows to listen for them.
AS code:
import flash.external.ExternalInterface;
ExternalInterface.addCallback("PlayPause", playPauseMovie);
...
function playPauseMovie():void {
//code goes here
}
精彩评论