It seems every time I try something new I need to fix other people’s problems to get it to work, arrrrg! [:(] I decided to try use Flash 8′s ExternalInterface() class to communicate with the Javascript function on my page. I liked the sound of this method because I can pass an array of arguments with it and return a variable back from the Javascript to my Actionscript – all in one command! I whipped something up real quick and bam! it works! Then I moved the SWF into it’s destination: the middle of an HTML form – to my amazement it didn’t work! I was using Internet Explorer 6, so I tried Firefox 2.0 and it worked fine. It also worked fine in Firefox 1.5 (a little less compatible) and even Opera 9.00 Beta! Wow, seriously IE – you got beat by Opera Beta [:P]. It also failed in IE7. To make a long story short, I spent 6+ hours trying to figure out what was wrong – finally I realized the code was fine and it was a IE bug. There’s a bunch of speculation and suggested fixes on the Adobe / Macromedia Flash 8 ExternalInterface() LiveDocs page, but they’re either overly-complicated or they don’t work. So I sat down and figured it out, then I made my own fix, which I consider to be very easy
.
Here’s the solution: SWFFormFix by me, Steve Kamerman
. Here’s the deal, basically, you need to trick Internet Explorer because if you put an object in a form, IE’s implementation of Javascript seems to want to look for “window.yourObject” and not “document.form[x].yourObject”, so my script figures out which form you are in and makes an alias at the wrong location that points to the right location. Don’t believe me? Try it out.
Here are some examples:
A SWF outside of a FORM (using SWFObject to embed)
A SWF inside of a FORM (using SWFObject to embed)
A SWF inside of a FORM (using std Flash EMBED tags)
A SWF inside of a FORM (using SWFObject and SWFFormFix)
As you should see, SWFFormFix fixes the problem and leaves you with zero errors – plus it’s free!
Download SWFFormFix:
http://devel.teratechnologies.net/swfformfix/swfformfix.js
Usage:
1. Include the swfformfix.js script in the head of your document
<head>
<script type="text/javascript" src="swfformfix.js"></script>
</head>
2. Run the SWFFormFix(yourObject) command on your SWF.
Example with SWFObject (recommended):
This is replaced by the Flash movie.
</div>
<script type="text/javascript">
// <![CDATA[
var so = new SWFObject("myMovie.swf", "myMovieObjectName",
"200", "100", "6.0.0", "#ffffff");
so.addParam("quality", "high");
so.write("swfdiv_ttpreview");
SWFFormFix("myMovieObjectName");
// ]]>
</script>
Example with std Flash EMBED tags:
width="200" height="100" id="myMovieObjectName" align="middle">
<param name="movie" value="myMovie.swf" />
<param name="quality" value="high" />
<embed src="myMovie.swf" quality="high" width="200" height="100"
name="myMovieObjectName" type="application/x-shockwave-flash" />
</object>
<script type="text/javascript">
// <![CDATA[
SWFFormFix("myMovieObjectName");
// ]]>
</script>
If you are still using the old school EMBED tags, you should really get with the program and start using SWFObject!! SWFObject (by Geoff Stearns) not only cleans up your code, but it removes the annoying gray box around your Flash movies in Internet Explorer 7 (or earlier with updates). I made a nice little script called HTML2SWFObject a couple months back that converts your old EMBED code to SWFObject code – check it out!
« Convert Flash-generated embed code to SWFObject format SWFFormFix 1.0.0 Released – Now with AUTO mode! »

Thanks! Great work!
Thanks this has really helped me out!..
just one slight prob though. when i hit the refresh button the page refreshes but the pesky javascript errors show up too! any ideas why?/how to fix this?
thanks again
Adam – sometimes IE's caching will kill your bidirectional communications with Flash – if your application is small enough you could try using the noCache() option to force the SWF to download every time.
I don't understand why you add all that code to your page, when you might as well just write window["yourmoviename"] = document.getElementById("yourmoviename"); It works for me that's for sure.
[strong]Excellent!!![/strong] [:P]
Thanks. It has helped a lot!
I have the same problem as Adam… whenever I refresh the page or come back to it, the javascript errors have returned, and the script no longer functions. Thoughts?
Adam Langviser is right, his trick works perfectly. for me at least. but thank you steve for having documented everything and gave samples and scripts…
[:)] Excellent solution! Thanks
Thanks, this saved my day!
Thanks so much man!!! You made my (and my company's) day! So instead of debugging my application over the weekend, I can spend it BBQing with my GF!
Thanks again!!