A couple of things which stand out: 1) I don't see anywhere in your pasted Flash code which deals with a Flash var called "mp3", so I am unsure if there is more to the code or if the swf is not designed to take the mp3 var initially...
2) As you have a proper ExternalInterface method which loads / kills external sounds etc, you shouldn't ever need to destroy/recreate your swf (unless you are using the same dom element to load other swfs/content. 3) I would listen for the "resetPlay" function call in your html/js code, as this tells you when the swf is loaded/external interface is all set up etc. You are then safe to call doPlay(), stopPlay() etc on your swf. 4) Have a look at the EI example o the test suite to see how the code checks for the existence of functions / wires up the html buttons etc: http://www.bobbyvandersluis.com/swfobject/testsuite_2_2/test_dynamic_com.html with embed callback: http://www.bobbyvandersluis.com/swfobject/testsuite_2_2/test_dynamic_com2.html Cheers, Aran On Tue, Nov 29, 2011 at 2:59 PM, Arknath <[email protected]> wrote: > Hi all, > > New to the group, so hi! > > Having an issue getting my JS to call ActionScript (AS) functions. > > Scenario: > > Have a page full of ringtones (15-25) and want to have the ability to > play a preview before purchase. Using a single file (ringtone.swf) > that has ActionScript that looks like this (I did not write this AS): > > import flash.external.*; > > ExternalInterface.addCallback("stopPlay", this, stopPlay); > ExternalInterface.addCallback("doPlay", this, doPlay); > > _global.mySong = null; > _global.duration = null; > _global.position = null; > _global.playingID = null; > _global.streamingID = null; > _global.absoluteURL = "/url/where/ringtone/stored/ringtone.php?id="; > > > function formatTime(millis) { > var mins = Math.floor(millis / 60000); > var remaining = millis - (mins * 60000); > var secs = Math.floor(remaining / 1000); > if(secs < 10){ > secs = '0' + secs; > } > return mins + ':' + secs; > } > > var tooLong = 0; > > function displayStreaming(mySound, where) { > if(tooLong++ > 3000) { > ExternalInterface.call('alert', "We're sorry, it appears that > this ringtone isn't available for listening at this time. Please try > again later."); > clearInterval(streamingID); > stopPlay(); > tooLong = 0; > } else if(mySound.duration > 0) { > if(mySound.getBytesLoaded() == mySound.getBytesTotal()) { > clearInterval(streamingID); > ExternalInterface.call(isLoaded); > tooLong = 0; > } > where.text = formatTime(mySound.duration); > } > } > > function displayPosition(mySound, where) { > if(mySound.position > 0){ > if(mySound.position == mySound.duration) { > clearInterval(playingID); > } > where.text = formatTime(mySound.position); > } > } > > function doPlay(mp3){ > theSong = loc + absoluteURL + mp3; > > clearInterval(streamingID); > clearInterval(playingID); > > if(typeof mySong == "object") { > mySong.stop(); > delete mySong; > } > > duration.text = '0:00'; > position.text = '0:00'; > > mySong = new Sound(); > mySong.loadSound(theSong, true); > > streamingID = setInterval(displayStreaming, 1, mySong, duration); > playingID = setInterval(displayPosition, 1, mySong, position); > > mySong.onSoundComplete = function(){ stopPlay(); } > } > > function stopPlay() { > duration.text = "0:00"; > position.text = "0:00"; > > mySong.stop(); > delete mySong; > > clearInterval(streamingID); > clearInterval(playingID); > > ExternalInterface.call(resetPlay); > } > > function initSound() { > duration = _root.total_txt; > position = _root.time_txt; > } > > initSound(); > > My JS looks like this: > > //Embeded <object> ID > var embed_id = "ringtone"; > > //Global SWFObject vars > var player = "myContent"; > var audio_file = "/assets/swf/ringtone.swf"; > var player_width = '16'; > var player_height = '16'; > var flash_ver = "9.0.0"; > var express_install = false; > var params = {allowScriptAccess: "always", swliveconnect: "true", > wmode: "transparent"}; > var attributes = {id:embed_id,name:embed_id}; > var call_backs = function(){}; > > //Gets current site URL > var base_url = "http://" + window.location.hostname + "/ > product/"; > > function loadSWF(preview_id){ > > //SWFObject Vars > var flashvars = {loc: base_url};//, mp3: preview_id}; > //var flashvars = {}; > > swfobject.embedSWF(audio_file, player, player_width, player_height, > flash_ver, express_install, flashvars, params, attributes, > call_backs); > } > > //Determines the existence or absence of a previously embedded swf > file > function swfExists(obj_id){ > var exists = false; > var object_tag = $("#"+obj_id); > > if(object_tag && (object_tag.is("object") || > object_tag.is("embed"))){ > exists = true; > } > console.log("Exists: " +exists); > return exists; > } > > $(document).ready(function(){ > > $(".ringtone-preview").on("click",function(e){ > e.preventDefault(); > var preview_id = $(this).attr('id'); > console.log("Preview ID:" + preview_id); > //check to see if object exists > if(swfExists(embed_id)){ > console.log("Secondary click"); > swfobject.removeSWF(embed_id); > $("body").append("<div id='"+player+"'></div>"); > loadSWF(preview_id); > }else{ > console.log("Primary click"); > loadSWF(preview_id); > } > > var obj = document.getElementById(embed_id); > console.log(obj); > if (obj){ > obj.doPlay(preview_id); > console.log("Playing"); > } > }); > }); > > I get an error when it gets to the "obj.doPlay(preview_id)" line that > reads: > > obj.doPlay is not a function > > If run loadSWF without the "mp3 : preview_id" piece commented out, > then it plays the ringtone. However, I want to be able to access the > stopPlay() function if the user fires the .ringtone-preview event > again. > > I feel i'm almost there...just need access to the flash script. > > Any help is appreciated. > > -- > You received this message because you are subscribed to the Google Groups > "SWFObject" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]. > For more options, visit this group at > http://groups.google.com/group/swfobject?hl=en. > > -- You received this message because you are subscribed to the Google Groups "SWFObject" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/swfobject?hl=en.
