http://blog.deconcept.com/swfobject/
Please read: SWFObject 2.0 has been released and is now hosted on the code.google.com website. Please consider the information found here obsolete.
SWFObject is a small Javascript file used for embedding Adobe Flash content. The script can detect the Flash plug-in in all major web browsers (on Mac and PC) and is designed to make embedding Flash movies as easy as possible. It is also very search engine friendly, degrades gracefully, can be used in valid HTML and XHTML 1.0 documents*, and is forward compatible, so it should work for years to come.
* Pages sent as text/html, not application/xhtml+xml.
Table of Contents
For a full list of changes, please see my SWFObject 1.5 blog post.
[For the über nerds, you can view the raw javascript here.]
Using SWFObject is easy. Simply include the swfobject.js
Javascript file, then use a small amount of Javascript on your page to embed your Flash movie. Here is an example showing the minimum amount of code needed to embed a Flash movie:
<script type="text/javascript" src="swfobject.js"></script><div id="flashcontent"> This text is replaced by the Flash movie.</div><script type="text/javascript"> var so = new SWFObject("movie.swf", "mymovie", "400", "200", "8", "#336699"); so.write("flashcontent");</script>
Here is a breakdown of what the code does:
<div id="flashcontent">[...]</div>
Prepare an HTML element that will hold our Flash movie. The content placed in the ‘holder’ element will be replaced by the Flash content, so users with the Flash plug-in installed will never see the content inside this element. This feature has the added bonus of letting search engines index your alternate content.
var so = new SWFObject(swf, id, width, height, version, background-color [, quality, xiRedirectUrl, redirectUrl, detectKey]);
Create a new SWFObject and pass in the required arguments:
swliveconnect
. "6.0.65"
. Or you can just require the major version, such as "6"
. Optional arguments are:
"high"
. ?detectflash=false
to the url of the document containing the Flash movie. so.write("flashcontent");
Tell the SWFObject script to write the Flash content to the page (if the correct version of the plug-in is installed on the user’s system) by replacing the content inside the specified HTML element.
SWFObject works quietly in the background of your HTML document. When developing pages that use SWFObject, you should start with your alternate (non-Flash) content first. Get your pages working without your Flash movies, then add them in later with little Javascript snippets that replace your alternate content with the Flash movies. This ensures that the alternate content will be indexed by search engines, and that users without the Flash plug-in will still see a working HTML page. Whether you provide upgrade instructions or not is up to you. If your alternate content can suffice, there may be no reason at all to tell people they are missing out on Flash content.
SWFObject works in all the current web browsers, including, on PC: IE5/5.5/6, Netscape 7/8, Firefox, Mozilla, and Opera. On Mac: IE5.2, Safari, Firefox, Netscape 6/7, Mozilla, and Opera 7.5+, and should continue to work well into the future.
SWFObject detects Flash player versions in these browsers from version 3 and up, and will allow users to interact with your Flash content without ‘activating’ it first. For more information on this, see this blog post on the Internet Explorer Eolas patent dispute.
SWFObject can detect minor versions and revision versions of the Flash Player as well, simply by passing the string value of the version you want. An example of requiring Flash player v.6.0 r65 (or 6,0,65,0) would be:
var so = new SWFObject("movie.swf", "mymovie", "200", "100", "6.0.65", "#336699");
SWFObject’s built in plug-in detection can be bypassed. If a new browser is ever launched or for some reason the plug-in detection fails on a user’s system, you can include a bypass link that will disable the detection built into SWFObject, and it will always write the Flash content to the page. To use the bypass link, simply link to the page with your Flash content on it, and include a single url variable called ‘detectflash’ and set it to ‘false.’ Here is an example of what that link would look like:
<a href="mypage.html?detectflash=false">Bypass link</a>
The example given above is what you need for the bare bones use of SWFObject, but what if you want to use some of the other parameters the Flash plug-in has to offer? SWFObject makes it very easy to add any extra parameter you may need. The examples below are a number of different methods you may wish to use to embed your Flash content.
<script type="text/javascript"> var so = new SWFObject("movie.swf", "mymovie", "400", "100%", "8", "#336699"); so.addParam("quality", "low"); so.addParam("wmode", "transparent"); so.addParam("salign", "t"); so.write("flashcontent");</script>
Here is a full list of the current parameters and their possible values on adobe.com.
Using Flashvars is the easiest way to get data from your HTML into your Flash movie, but you can only pass the data in when your movie first loads. Normally, you would add a parameter called “flashvars” and then for the value, you passing a string of name/value pairs like this: variable1=value1&variable2=value2&variable3=value3
and so on. SWFObject makes this a bit easier by allowing you to add as many variables as you like in a similar manner in which you add additional parameters. Here is an example of passing values into your Flash movie using Flashvars:
<script type="text/javascript"> var so = new SWFObject("movie.swf", "mymovie", "400", "200", "8", "#336699"); so.addVariable("variable1", "value1"); so.addVariable("variable2", "value2"); so.addVariable("variable3", "value3"); so.write("flashcontent");</script>
Once this is done, all of the variables you pass in will be available immediately inside the Flash movie. Just access them as you would any variable on the _root
timeline.
The SWFObject script also comes with an extra function which allows you to pull variable values from the url string. An example is you have a url that looks like this: http://www.example.com/page.html?variable1=value1&variable2=value2
. Using the function getQueryParamValue()
you can easily pull these values from the url and then pass them into your Flash movie. Here is an example, we’ll assume that the url looks like the above example:
<script type="text/javascript"> var so = new SWFObject("movie.swf", "mymovie", "400", "200", "8", "#336699"); so.addVariable("variable1", getQueryParamValue("variable1")); so.addVariable("variable2", getQueryParamValue("variable2")); so.write("flashcontent");</script>
The getQueryParamValue()
function also supports reading variables from the location.hash
, as used sometimes when deep linking into your Flash applications. For an example of how deep linking to your Flash movies using the location.hash
variable, check out this demo of Slideshow Pro, which uses the SWFObject embed.
SWFObject has full support for the Adobe Flash Player Express Install feature. Your users never have to leave your site to upgrade their player.
To use ExpressInstall, you must first upload the expressinstall.swf to your web server. Then, use the useExpressInstall
method to specify the path to your expressinstall.swf. If no path is specified, SWFObject will look in the same folder as the current HTML page.
<script type="text/javascript"> var so = new SWFObject("movie.swf", "mymovie", "200", "100", "8", "#336699"); so.useExpressInstall('expressinstall.swf'); so.write("flashcontent"); </script>
If you want to see ExpressInstall in action, you can install Flash player 7 (or 6.0.65) and visit this page.
If you wish to customize the Express Install feature, the source code to the expressinstall.swf is included with SWFObject.
If your Flash movie is in a popup window, or you wish to redirect the user to a different location after they complete the ExpressInstall update, you can use the xiRedirectUrl
attribute to redirect the user back to your landing page instead of the actual page with your Flash movie.
<script type="text/javascript"> var so = new SWFObject("movie.swf", "mymovie", "200", "100", "8", "#336699"); so.useExpressInstall('expressinstall.swf'); so.setAttribute('xiRedirectUrl', 'http://www.example.com/upgradefinished.html'); // must be the absolute URL to your site so.write("flashcontent");</script>
SWFObject is released under the MIT License. This means (basically) that you can use it for whatever you want with no restrictions.
Download SWFObject 1.5 – Zip file, includes swfobject.js and the example html templates below.
Or, if you are more of a hands on type, you can view my example pages:
* Pages are sent as text/html, not application/xhtml+xml.
While you’re at it, you may want to sign up for the SWFObject mailing list. This list is a discussion list for asking questions about problems you might be having using SWFObject or to request and discuss new features. –>
Need help with SWFObject? Try asking for help in the SWFObject forum!
Over the years there have been many methods to detect Flash player versions and embed Flash movies into HTML documents. This section will take a look at each of the most popular methods and point out the problems with each.
Everyone knows the default Adobe provided Flash embed. It consists of an Object tag with an Embed tag placed inside as a fallback mechanism. This is the most popular Flash embed method and is the default choice when publishing your Flash movie from the Adobe Flash IDE. This is the most compatible way to embed a Flash movie, and will work in the widest range of browsers. Here is a sample of the default Flash embed code:
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0" width="550" height="400" id="Untitled-1" align="middle"><param name="allowScriptAccess" value="sameDomain" /><param name="movie" value="mymovie.swf" /><param name="quality" value="high" /><param name="bgcolor" value="#ffffff" /><embed src="mymovie.swf" quality="high" bgcolor="#ffffff" width="550" height="400" name="mymovie" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer" /></object>
While this is the most common method of embedding your Flash movies, it does have a few issues.
embed
tag in any version of HTML or XHTML. However, since many browsers handle object
tags differently (or not at all, or the implementation is too buggy), the embed tag was needed as a fallback mechanism. This method gained popularity after the A List Apart article came out back in 2002. Here are two examples of ‘object tag only’ embedding and Flash satay:
‘Object tag only’
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" width="300" height="120"> <param name="movie" value="http://www.macromedia.com/shockwave/download/triggerpages_mmcom/flash.swf"> <param name="quality" value="high"> <param name="bgcolor" value="#FFFFFF"> <!--[if !IE]> <--> <object data="http://www.macromedia.com/shockwave/download/triggerpages_mmcom/flash.swf" width="300" height="120" type="application/x-shockwave-flash"> <param name="quality" value="high"> <param name="bgcolor" value="#FFFFFF"> <param name="pluginurl" value="http://www.adobe.com/go/getflashplayer"> FAIL (the browser should render some flash content, not this). </object> <!--> <![endif]--></object>
Flash satay
<object type="application/x-shockwave-flashdata="c.swf?path=movie.swf"width="400" height="300"><param name="movie"value="c.swf?path=movie.swf" /><img src="noflash.gif"width="200" height="100" alt="" /></object>
param
tags – Up until version 2.0 (on Tiger) or 1.3 (on Panther) and possibly 1.2.8 (pre Panther) Safari would completely ignore the param
tag. This meant that if you tried to set other options using them, like Flashvars or Align, Salign, etc. Safari would not see those values. This method involves placing a single Flash movie on the index page of your website, and this Flash movie then checks the $version
variable in the Flash player and redirects the user either to the Flash content inside the site, or an upgrade page.
Problems with this method include:
Adobe has done an excellent job with the new Flash 8 detection kit – but not quite excellent enough. It contains two different ways to detect the Flash plug-in:
I’ve put together a more in-depth look at the Adobe detection kit over here.
It’s hard to critique this method as it usually varies from site to site. However, most Javascript Flash detection schemes I have come across generally suffer from the same faults:
SWFObject now has a forum for people looking for help implementing it. Please send all support requests to the forum, there are plenty of capable people there to help you.
Still having problems? Try reading through the previous SWFObject posts [1, 2, 3] on this blog (especially the comments), as many common questions have been covered there.