Flash Embedding Cage Match
Issue № 232

Flash Embedding Cage Match

“How can you best embed Flash content?”

Article Continues Below

It should be a simple question, but is likely to evoke a lot of different opinions and arguments, as each of the many available embedding techniques have their own pros and cons. In this article, I will look into the complexities and subtleties of embedding Flash content and examine the most popular embedding methods to see how good they really are.

The key ingredients of a great Flash embedding method#section2

Before we get into the nitty-gritty, let’s first define our ideal Flash embedding method. In my opinion, the following criteria matter the most:

Standards compliance#section3

Web standards offer a universal language to a whole ecosystem of browser makers, tool builders, and web authors, so that all of these audiences can avoid compatibility problems, vendor lock-ins, and patent-infringement issues. They also enable you, the developer, to create valid HTML, which is often a project requirement.

Cross-browser support#section4

Support for all major browsers and popular operating systems is a critical requirement. To support my research, I have created a Flash embed test suite to assess browser support for various markup-based embedding methods. The test suite includes information on parameters including support for different Flash publish settings, streaming, and scriptability.

Support for alternative content#section5

In all cases where you like to create search-engine–friendly content or content that is accessible to people who browse the web without plugins, alternative content is your best friend.

Avoidance of Flash content/player mismatches#section6

Unfortunately for all of us, the Flash player will attempt to play Flash content no matter what Flash plugin version that content was published for. This works fine as long as an outdated plugin doesn’t encounter functionality that is only available in higher plugin versions. If it does, your users will see broken content or no content at all. We want to avoid that.

Auto-activation of active content#section7

As the result of the Eolas patent infringement, Microsoft updated its web browsing software so visitors can no longer directly interact with Microsoft ActiveX controls loaded by object and embed elements, also called “active content.”

In short, Microsoft browsers will not allow any user interaction with active content until the user clicks to activate the control. To avoid litigation, Opera also introduced a similar click-to-activate mechanism. These mechanisms work like speed bumps in the road: you have to break, slowly drive over it, and push the gas pedal again. It can confuse the casual web surfer and annoy the more experienced user.

Ease of implementation#section8

Simplicity counts. Why jump through hoops if things can be done more easily?

Flash embed basics: embed and object#section9

There are two HTML elements that enable you to insert Flash content into a web page. On one hand, you have the proprietary <!-- 403 MAR2013 -->embed element<!-- -->, which is supported by all major browsers (Line wraps marked » —Ed.):

<embed type="application/x-shockwave-flash" »
src="myContent.swf" width="300" height="120"  »
pluginspage="http://www.adobe.com/go/getflashplayer" />
<noembed>Alternative content</noembed>

On the other hand, you have the object element, which is a W3C recommendation. Because the W3C specifications leave quite a bit of room on how to implement plugin content, two different object implementations have emerged over time.

Most modern browsers have implemented a standards-compliant alternative to the embed tag by using the object’s MIME-type to locate the appropriate plugin (Line wraps marked » —Ed.):

<object type="application/x-shockwave-flash" »
data="myContent.swf" width="300" height="120">
<p>Alternative content</p>
</object>

This method is not browser-specific and is therefore the preferred implementation.

The second implementation comes from Internet Explorer on Windows, which requires that you define the object’s classid attribute so a browser can load the proper Flash player ActiveX control, which is a valid but browser-specific implementation (Line wraps marked » —Ed.):

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8- »
444553540000" width="300" height="120">
<param name="movie" value="myContent.swf" />    
<p>Alternative content</p>
</object>

Note: In the last two code examples I have deliberately omitted the codebase parameter, which is often used to point to the URL of the Flash plugin installer on Adobe’s servers, so a browser can automatically download it if it is not already installed. However this is illegal according to the specifications—which restrict its access to the domain of the current document only—and therefore not supported by all modern browsers.

Why embed is still around#section10

From a web standards point-of-view it may be easy to just cut the embed element out of the equation. It simply has never been a W3C recommendation and it never will be, because of patent issues. However in reality it does have better cross-browser support than each single implementation of the object element alone. As a result it has even become the markup of choice on popular websites like Google Video and Brightcove.

Although web standards are created to avoid compatibility issues, the embed element is more unambiguous than the W3C-approved object element. embed’s strict implementation rules and good support have turned it into a de facto standard that will haunt us until we’ve had universal support for the object element long enough to begin ignoring the browser versions that don’t like it.

So what are those browser-support problems?

Where web standards support is broken#section11

The dual implementation of the object element technically doesn’t break web standards, but it is the root of many problems. As a consequence, we need to find a way to combine the two object implementations into a single technique. To make matters worse, we also have to deal with browsers that have (or used to have) a broken object implementation. Let’s take a look at the problems:

  • The generic object implementation breaks in Internet Explorer on Windows. IE loads the plugin and the SWF file, but doesn’t display the Flash content.
  • When we partially combine the two implementations by adding the movie parameter to the generic implementation, Internet Explorer is able to display the Flash content, but not to stream it.
  • If we completely merge the two implementations, everything works fine in Internet Explorer, but Gecko-based browsers ignore the Flash content and show alternative content instead.

One of the features of the object element is that you can nest different implementations within each other (Line wraps marked » —Ed.):

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8- »
444553540000" width="300" height="120">
<param name="movie" value="myContent.swf" />

<object type="application/x-shockwave-flash" »
data="myContent.swf" width="300" height="120">
<p>Alternative content</p>

</object>

</object>

Unfortunately, a bug in older versions of Internet Explorer treats nested object elements as if they are in series, attempting to render both of them.

To make matters worse, versions of Safari up to and including version 1.2.2 on Mac OS 10.3 ignore the object element’s nested param elements, though they support the same attributes for the embed element.

Note: You may also be asking yourself how much sense it makes to define the same content, attributes, and parameters twice, as in the above technique. This combined method also makes it harder to, for example, use JavaScript to communicate with your Flash content, as you would have to test which object you communicate with.

We are slowly moving towards a better world: some of these bugs are already fixed, but Internet Explorer’s non-generic and buggy object implementation is still stifling the adoption of the object element. We can only hope that this will be fixed in the near future.

Why object is better than embed#section12

Despite its current lack of cross-browser support the object element still has more to offer than the embed element, because in addition to being standards-compliant, it also offers superior support for alternative content.

The object element allows you to nest alternative content inside of it, and this content is displayed if an implementation is not supported or a plugin is not installed. This content will also be picked up by search engines, making it a great tool for creating search-engine–friendly content.

The embed element supports alternative content by offering the noembed element, but this only works for those few browsers that don’t support the embed element itself, like Internet Explorer on Windows Mobile platforms. Unlike the object element, embed doesn’t support alternative content when the embed element is supported, but the Flash plugin is not installed. In that situation, it relies on the pluginurl and pluginspage attributes to display an image broken puzzle piece that can be clicked on to install the plugin. Very 1990s.

I believe it’s a much better solution to display alternative content that describes the plugin content and includes a subtle indication that a user can have a richer experience by downloading the Flash plugin. (This is yet another reason we don’t really need the often-misused codebase attribute.)

To summarize, the object element offers significant advantages over the embed element if you prefer to create standards-compliant code or accessible, search-engine–friendly content.

The limitations of markup-only methods#section13

Considering the criteria we defined earlier—standards compliance, cross-browser support, support for alternative content, avoidance of player/content mismatches, auto-activation of active content, and ease of implementation—it’s easy to see that there’s really only so much that markup can do by itself.

Although markup offers the means to display Flash content or alternative content, it will not be able to provide us with a solution to avoid Flash content and plugin mismatches or a workaround to avoid having to click to activate active content, and it’s not always the simplest thing to implement, either.

Still, let’s take a quick look at the most popular markup “combination” methods.

The twice-cooked method#section14

In the Flash IDE, you can publish HTML pages that include the so-called twice-cooked method, combining Microsoft’s specific object implementation with the proprietary embed element nested inside it as alternative content (Line wraps marked » —Ed.):

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8- »
444553540000" codebase="http://fpdownload.macromedia.com »
/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" »
width="300" height="120">
<param name="movie" value="myContent.swf" />
<embed type="application/x-shockwave-flash" »
src="myContent.swf" width="300" height="120" »
pluginspage="http://www.macromedia.com/go »
/getflashplayer" />
</object>

As you can see, this method is solely based on proprietary and vendor-specific markup. It clearly focuses on cross-browser support only, and isn’t standards compliant.

The twice-cooked method is redundant, makes your web pages invalid, and doesn’t include a mechanism for inserting alternative content. And the only reason it’s easy to use is because the Flash IDE generates it: don’t ask anyone to reproduce it from memory.

The nested-objects method#section15

Nesting the two object implementations is a good alternative to the twice-cooked method, because it add standards compliance and supports alternative content. Let’s take a look (Line wraps marked » —Ed.):

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8- »
444553540000" width="300" height="120">
<param name="movie" value="myContent.swf" />
<object type="application/x-shockwave-flash" »
data="myContent.swf" width="300" height="120">
<p>Alternative content</p>

</object>

</object>

Unfortunately it still lacks cross-browser support due to Internet Explorer’s nested object element bug and Safari’s lack of support for nested param elements. A common workaround uses proprietary Internet Explorer conditional comments to avoid this browser’s pitfalls (Line wraps marked » —Ed.):

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-»
444553540000" width="300" height="120">
<param name="movie" value="myContent.swf" />
<!--[if !IE]>-->    
<object type="application/x-shockwave-flash" »
data="myContent.swf" width="300" height="120">

<!--<![endif]-->

<p>Alternative content</p>
<!--[if !IE]>-->    
</object>
<!--<![endif]-->

</object>

Besides the previously mentioned redundancy, this method is even more complex to author and it uses an ugly workaround that may complicate the process of generating code using server-side languages.

Flash Satay#section16

Another option is the Flash Satay method, which is based on the generic object implementation and includes an additional movie parameter to avoid the bug that causes Flash content not to display in Internet Explorer. It also includes a container Flash movie to fix the Internet Explorer streaming bug (Line wraps marked » —Ed.):

<object type="application/x-shockwave-flash" »
data="c.swf? path=myContent.swf" width="300" height="120">
<param name="movie" value="c.swf?path= »
myContent.swf" />
<p>Alternative content</p>
</object>

Although it approaches the “ideal” generic object implementation, Flash Satay contains a workaround whose architectural implications won’t suit everybody—and it also doesn’t support nested param elements in older versions of Safari.

The case for DOM scripting#section17

When you consider the limitations of markup-only methods, you might wonder why we shouldn’t just use a DOM script instead. With scripting, we could dynamically serve the markup each browser requires:

  • The browser-specific object implementation for Internet Explorer.
  • The proprietary embed element for older versions of Safari.
  • The generic object implementation for all other browsers.

A DOM script is also flexible enough to solve our other problems: for starters, we can use it to solve the Flash player and content/player mismatch problem by detecting the plugin version and testing per Flash movie whether Flash content or alternative content needs to be shown. When the required plugin version is not available we could trigger <!-- 404 MAR2013 -->Adobe express install<!-- -->, a mechanism built into the Flash player that simplifies the plugin-download process.

A DOM solution also allows us to avoid click-to-activate mechanisms by dynamically writing the object elements.

Things to keep in mind when using JavaScript#section18

Because not everybody is an experienced JavaScripter—and because even those who are shouldn’t have to reinvent the wheel—it makes sense to use an existing Flash-embedding JavaScript library. Let’s consider the criteria for selecting a trustworthy library.

Standards compliant markup is rarely promoted by library-makers, because these libraries either define your Flash content in JavaScript itself or in a development tool that does the work for you. Most libraries generate invalid HTML and, because the markup is written dynamically, the W3C validator is unable to check your markup.

Another point to consider is how well a method degrades when JavaScript is disabled, unsupported, or not supported well enough. What would be the point in using JavaScript to improve the user experience for one group of visitors, when by doing so you break it for another?

With all of this in mind, let’s take a look at some of the most popular libraries to see how well they behave.

The Adobe Flash player detection kit#section19

Besides the generated markup in the Flash IDE Adobe also provides the Flash player detection kit. There are three ways of using this kit:

  1. Checking the Detect Flash Version checkbox (under File > Publish Settings > HTML) in the Flash 8 IDE.
  2. Inserting it manually after downloading the detection-kit ZIP file.
  3. Publishing from Flex Builder 2, where it is included by default.

Although the detection kit contains all the features we want, like version detection, express installation, and auto-activation of active content, it has room for improvement. When it comes to standards compliance it hopelessly fails: it is still based on the twice-cooked markup, so it either generates Microsoft’s vendor-specific object implementation or the proprietary and noncompliant embed element.

It also supports alternative content although in an odd and inconsistent manner. You need to define your alternative content twice: in both inline JavaScript and in a noscript element. And while the Flash IDE and the downloadable detection kit leave it up to you in terms of what to define as alternative content, Flex 2 by default inserts the whole twice-cooked code blurb in the noscript element in order to display Flash content in web browsers that either don’t support JavaScript or have JavaScript disabled.

All in all, the detection kit lacks a good strategy and a set of documented best practices on how to either promote proper degradation or make Flash content search-engine–friendly and accessible. And it’s still not the easiest solution to use if you need to customize it.

UFO and SWFObject#section20

Popular open source alternatives like my own UFO and Geoff Stearns’s SWFObject are probably the most complete and easiest-to-use libraries currently available.

Although they look similar on the surface, the two libraries are quite different under the hood. For example, SWFObject uses Adobe’s twice-cooked method, while UFO generates mostly standards-compliant markup. On the other hand they do share architectural principles: both libraries are built around the idea that you author marked-up alternative content (thus creating accessible, search-engine–friendly content) that is replaced by a DOM script when the required Flash and JavaScript support is available.

Despite their explicit support for alternative content, both libraries still have one fundamental weakness: they rely on JavaScript to insert Flash content. As a result a small group of visitors that have the Flash plugin installed but have JavaScript disabled or lack sufficient JavaScript support will see only alternative content.

The case for unobtrusive DOM scripting#section21

To solve the degradation issue, it would make more sense to use a truly unobtrusive embedding method: a hybrid solution that uses standards compliant markup like that used in the Flash Satay method to embed both Flash content and alternative content while employing an unobtrusive DOM script that serves as an add-on to fix problems and add services to modern browsers.

ObjectSwap is based on these principles and is in my opinion an architectural role model for future Flash embedding libraries. Unfortunately, ObjectSwap focuses primarily on the auto-activation of active content, so it isn’t as useful for version detection and markup-support problems like the lack of streaming support in Internet Explorer or parameter support in older versions of Safari.

Another point it can be improved on—which is something to keep in mind for all unobtrusive libraries—is performance. By using the onload event, your DOM related behavior is only applied after a whole page, including all of its assets, is loaded. A better alternative would be the DOMContentLoaded event, which lets you apply your behavior as soon as a page’s DOM is available. Because the DOMContentLoaded event is not fully supported across browsers yet, you could use this solution instead.

The future of Flash embed#section22

Although the perfect solution may not have been written yet, I do think we are already pretty far into the right direction. If we combine the best features of different libraries, we should be able to fulfill all the criteria we defined at the beginning of this article.

In search of the solution, Geoff Stearns and I have teamed up. Instead of rewriting UFO and SWFObject, we are working on a single new, standards compliant and completely unobtrusive solution that will eventually replace both libraries. The fruit of this co-operation is the SWFFix project, which is currently in the alpha phase.

Step up, software makers!#section23

Although web developers can come up with creative workarounds, it is the browser and plugin makers who have the ability to make real progress. By fixing outstanding bugs and adopting embedding solutions that support both web standards and promote the use of alternative content, they could give developers the means to do their daily jobs the right way. So how about it, software developers?

54 Reader Comments

  1. “In search of the solution, Geoff Stearns and I have teamed up. Instead of rewriting UFO and SWFObject, we are working on a single new, standards compliant and completely unobtrusive solution that will eventually replace both libraries.”

    Hell yeah!

  2. As I read through this article, I felt myself getting more and more discouraged – until I read this:

    “In search of the solution, Geoff Stearns and I have teamed up. Instead of rewriting UFO and SWFObject, we are working on a single new, standards compliant and completely unobtrusive solution that will eventually replace both libraries.”

    Hell yeah!

  3. I’m quite glad to read several things in this article. First off, thanks for being willing to self-criticize. Too many people in this business feel that what they’ve done is the be-all, end-all solution. Your ability to look at what you’ve done and say “nope, its not quite good enough” is appreciated.

    Moreover, I’m glad to see you guys teaming up to improve the situation. I’ve been using UFO for a while now and I’ve always justified the lack of support for people with Javascript turned off by saying that in (what I imagine) would be nearly all cases where Javascript was not enabled, flash would not be enabled either. Sadly, I’ve done no real research to see if that view holds water.

    Looking forward to seeing this SWFFix project gain traction within the community. Thanks for (what I believe maybe the first) good, concise explanation of what is wrong with flash, object, and embed.

  4. Thanks for the article Bobby, SWFFix sounds like it will be a great product.

    One challenge I have with embedding flash is when the flash has some transparency and has to overlay on top of the HTML. When the flash movie is covering HTML in firefox, I can’t interact with the HTML at all. This is when setting the wmode parameter to “transparent”. Are you familiar with any fixes to this issue at all? Apologies if its outside the scope of this article.

    Thanks,
    Dave

  5. Tim: I think that the jQuery Flash plugin can be a good solution when you are already using the jQuery library. In all other cases you would add a lot of unnecessary overhead.

    Like the author writes in the script’s credits, it is pretty much inspired by SWFObject and UFO, which means it contains a lot of the same functionality, however it also shares the same degradation problems.

    When it comes to standards compliancy, it uses the embed element only.

  6. *Tim*: Thanks for the plug 🙂

    *Bobby*: You’re spot on about the jquery flash plugin. I decided to go for browser support and (much) simpler code over standards compliance by using embed. That said, it would be quite simple to swap out the method that generates the embed for a (mostly) standards compliant one, if one were so inclined.

    One other con to UFO, SWFObject, jQuery.flash, etc. is that the swf and parameters are usually defined in the javascript — mixing behavior and content — rather than in the markup where they belong.

    I think that a flash microformat (to define the swf, height, width, alternate content, etc.), paired with a library like jQuery (using it’s dom selection and manipulation to find and parse the microformat) and UFO/SWFObject/jQuery.flash (for version checking and generating markup) has some really interesting “possibilities”:http://jquery.lukelutman.com/plugins/flash/example-inline-params.html (sorry for the hasty example markup).

  7. Where does the migration of SWFObject to SWFFix leave accompanying libraries like SWFAddress? I really like SWFAddresses ability to allow deep linking of Flash and bookmarking.

  8. Chad: I saw you already got your question answered on the SWFFix devblog [http://www.swffix.org/devblog/?p=6#comment-9]

    Quote Geoff Stearns:
    “Yes, compatibility with SWFAddress and StateManager (and any other script for that matter) will be a high priority. However, the authors of these scripts may need to make small adjustments to their scripts for them to be compatible.”

  9. I included Flash video using this code – it works fine in IE 6.0 and Firefox 1.5 (without a classid).

  10. I work with JibJab — we’ve been experimenting with creating better RSS Feeds for popular videos, photo jokes, audio jokes, etc.

    One issue we’ve had is with the inclusion of media players in our RSS Feeds — has anyone written anything specially tuned to that topic?

    Dave

  11. Dave: This is another reason why JavaScript only solutions are not ideal. When you use an unobtrusive scripted solution (like SWFFix) that sits on top of your markup you would enable automated tools to pick up your Flash content.

  12. We are getting so close to a solution and then snags always come up:

    Because HTML code is not capable of detecting the version of Flash another method MUST be used, such as JavaScript.

    I though the JavaScript solution was best so far but then I discovered this issue:

    All JavaScript detection methods I have seen (Including UFO) hide the alternate content with “display:none”. The problem with this is that images inside that hidden content are still downloaded first by almost all browsers.
    (proof at: http://www.quirksmode.org/css/displayimg.html)

    Given that most Flash replacements are just a big image (or two), having both the image and flash load together is a huge waste of bandwidth!!!

    Has anyone else come across this problem or seen a solution?

  13. Davide: You are mixing things up here. This is feedback on UFO, you cannot generalize this for all JavaScript based methods. An unobtrusive solution as described in the article (like SWFFix) will unlikely suffer from this issue, because in most cases the object tag will do the loading for you.

    When a user has an outdated plugin version (the odds are dependent on which player version you publish for), a DOM manipulation will force the display of alternative content instead of Flash content. In this case your initial SWF may be loaded, while it will never be displayed. We can probably not avoid this for some browsers that execute tag based functionality before a DOM manipulation on DOM load. Again, the odds for this are very low as long as you don’t publish for the latest player version.

    Another problem we have to tackle is how to avoid double loads. To avoid the click-to-activate active content, we have to republish existing object tags for some browsers. If we don’t wait with the replacement until a SWF has completed loading, a browser will attempt to load it twice. So instead we wait until the SWF is loaded and then do the replacement, so a browser can pull the SWF out of the browser’s cache.

    For SWFFix load mgt is on our agenda to be dealt with properly. When the first public alpha is available, please give it a whiz and let us if you see any problems. All open issues will be discussed on the SWFFix devblog.

  14. Agree with you Bobby, it is only an issue with some Javascript implementations (ie, UFO, SWFObject and the one I just built for myself). Am sure there is a way around it, just wanted to bring it up as an issue.

    Am eagerly looking forward to SWFfix! I will certainly be keeping my eye on that. 🙂

  15. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash. Never use Flash.

  16. Bobby and Geoff this is excellent. I love the implementation of swfObject and with you both wrking together this is going to be the new standard for embedding. While developing please consider the fact that all Versions of Windows vista come standard with Flash Player 7.0.19. I am not sure why Microsoft is throwing us back a few years but the “Express Install”:http://blog.deconcept.com/swfobject/expressinstall.html should help with this but It would be nice not to have to restart the browser. I’m sure you guys will come up with something great. I post’ed a blog on the subject at “www.curtismorley.com”:http://curtismorley.com/2007/02/26/windows-vista-comes-with-ie7-and-flash-player-7/

    Good luck guys. I look forward to seeing the product soon.

  17. We use swfobject to embed the content of our swf in plain text so that search engines can pick it up and index the page(s) I would love it if the two of you would enhance the search engine compatibility while you are developing the new version.

    Thanks,
    “Curtis J. Morley”:www.curtismorley.com

  18. I think this article was quite insightful into the differing methods of marking up flash, however I am going to have to disagree with the author on his conclusions of the “nested-objects method.”

    I don’t really see any problems with the nested-objects method (assuming one uses conditional comments). I just tried it out, with the conditional comments, it validates perfectly. The only complaint by the author is that it looks “ugly” but quite frankly I find it quite simplistic, at least better than including 12kb javascript files. As for problems with authoring, that can be dealt with should your text editor have the ability to use snippets (these days, most do). Lastly I fail to see how the method could complicate server-side code, maybe someone could clear that up for me?

  19. I read the article from 2002 and this one about this problem and I’ve found that you don’t need two movies (the one that loads the other) to be declared. Indeed I tested a lot the examples and I found that this code:

    … shows the moviename1 with no problem in the browsers, IE object oriented and mozilla embed oriented.
    I can’t try it on safari but I hope when the site I’m working on is up, I’ll give you the url so you could check it.

    If the code is flawed, I really appreciate someone tells me the technical reason for not using a code like that.

    I was using a code someone gave me and the code was worse looking cause it had the moviename1 called in this way:

    value=”movie.swf?path=moviename1.swf”

    It could be seen ANYWAY, don’t know why.
    As is stated before, if someone clarifies me this piece of “black wizardry” I’ll be pretty happy.

    Thanks in advance.

  20. If the method described by Stephen works in IE 6 and Firefox 1.5 (without a classid). What browsers do not support it?

    Alternate Content

  21. Forget using flash on your site if you want to attract people. Flash no longer works… In Mozilla it looks horrible, on some broswers it is very slow. People are no longer patient to wait for flash to load.

    They need things done fast… My mentor recommended me not to use flash and make it easy as possible.

  22. I used the following code to put Flash video player in my page and it works perfectly because it’s a small file and doesn’t need to stream. However, it won’t pass 508 validation because there’s no “element” attribute. With an “element” it won’t pass XHTML validation. Aargh.

  23. I recently uninstalled Flash and installed v9. And guess what? Half of the Flash sites on the Web are prompting me to download Flash in IE6. Some use SWFObject, some use UFO, others use the typical user agent detection nonsense copied from Adobe’s ridiculous detection kit. One major rub is that most of these “solutions” that attempt to instantiate ActiveX objects until they hit one that works give up at version 7!

    Flash Satay and other scriptless solutions are clearly not viable. Two Flash movies for every one embedded? No thanks.

    And after looking at the research for the SWFFix thing, it is clear that it will never work without using the dreaded EMBED tag. It’s stated goal is to be a standards-based solution, so therefore it is an impossible dream. Without EMBED, full AS/JS interaction is unsupported in half of the browsers surveyed and even if you don’t need that functionality, there is the Safari PARAM tag bug. The latter could conceivably be worked around with user agent detection (yecch!), but that is hardly a standards-based solution.

    Flash is such a complete waste of time and resources, but if you must use it, then JavaScript and EMBED tags are required. And make sure your ActiveX detection can count past 7!

    This ridiculous object and the brain-dead scripts that attempt to implement it have left a legacy of broken sites all over the Internet. You know you have a problem when the company that owns the thing can’t figure it out. Open source projects have apparently failed as well. It is time for the Flash mavens to give up the ghost.

  24. On “IanAndWendy.com”:ianandwendy.com, a travel photos website, I use slideshowpro to show off our photos, and at the moment I use swfobject for swf insertion. My alt content is a plain page of web thumbnails in straight-up HTML. Works great, except, the swf doesnt get activated (or load?) until all the alt content (in this case the html with thumbnails) is loaded. This can delay load time substantially – especially for pages with many images/thumbnails. Any hints? I don’t know if ufo would help or suffer from the same “only progressive enhancement when the base page is done loading” problem.
    Example page with problem: “Beijing photos”:http://www.ianandwendy.com/OtherTrips/ChinaVietnamCambodia/China/Beijing/slideshowAOG.htm

    The progressive enhancement works great as far as search engines are concerned, by the way, lots of visibility on all the majors. But it pisses off visitors to have to sit and wait while a page of thumbnails that they won’t even see loads. Especially the poor schlubs with 56k.

    Thanks,

    Ian
    (by the way, any other comments on my design are welcomed)

  25. I’m an experienced programmer, but new to web development, trying to learn all I can, soaking up everything from great sites like this. It’s really disheartening, though, to see such disparity between browser implementations and the hoops we all have to jump through to do something that should be so simple, using the great standards and tools we have (like xhtml and css). Microsoft should hang their heads in shame for developing their own standards, and causing such turmoil across the web. Perhaps a simple solution is for everyone to just use Firefox until IE is rendered useless. At least Mozilla listens to their users…(and of course IE7 fixes all the problems I’ve been reading about).

  26. In response to David Mark’s post [None of these things will work], I offer this reply: IMHO Flash is the predominant video format across the internet and cable television. It works very well. What’s broken are the browsers that don’t implement standards, and force developers to write convoluted code in order to get the SWF to render correctly for the majority of their users. I too, get aggravated with large, slow loading flash sites that overdo it. However, there is a lot of great flash content that really makes the internet an enjoyable place. You just have to hope you have the right browser. Perhaps one day we can get past that, and microsoft will finally step up and take the lead on standards implementation.

  27. Great to hear you are attempting to fix the flash embed problem with Geoff Stearns.

    I have been trialing UFO for a week or so now and have come across a huge problem with IE, and it seems it has not been discussed anywhere on the web.

    When using innerHTML with the OBJECT tag IE 6 & 7 completely rewrites UFOs OBJECT tag.

    This is the string before _e.innerHTML has been set:

    var FO = { movie:”/mcm_hothits/flash/hh_test.swf”, width:”457″, height:”411″, majorversion:”8″, build:”0″, allowscriptaccess:”true”, allowfullscreen:”true”,allownetworking:”true”};
    UFO.create(FO, “flashMediaPlayer”);

    All fine, exactly what I asked for.

    But this is it after _e.innerHTML =

    IE is atomically parsing the object tag and adding extra PARAMs. This is ok when you are just displaying a movie. The problem is that my flash file depends on fullscreen=true. Clearly this is being set to false.

    Has anyone noticed this before? Is there a way to tell IE not to parse the object tag?

  28. While Flash Satay might approach the so-called “ideal”? generic object implementation, watch out.

    I’ve found that this method, when implemented as described, loads slowly in some browsers, locks the tabs in FireFox 2.0 making it impossible to switch to another tabbed page and causes random crashes in Netscape 7.1.

    Using the nested-objects method avoids these issues.

  29. I got the following reply from Geoff Stearns:

    bq. [it’s] living, but slow going. swfobject and ufo have been working so well, there isn’t really a big push to get it out (and we’ve had some technical and implementation issues we are trying to figure out). but we are hoping to launch it soon, and we are also working with adobe to make sure everyone is all happy.

  30. While you are looking to consolidate the projects and improve them, think about a work around for overlaying Flash content. SWFObject said it works for overlaying flash content but to-date I have never seen this fully functional.

  31. bob watts, i have just encountered the same situation with IE rewriting all my PARAM tags if I use innerHTML to retrieve content. why oh why is it doing this.

    i think
    a) never use innerHTML
    b) never use Flash

    I HATE YOU MICROSOFT and ALL THOSE OUT THERE WHO MADE STICKING 1 DAMN FLASH MOVIE ON A PAGE SUCH A RIDICULOUS TASK.

    someone please save me from this hell.

    im seriously considering changing professions to something simpler like investment banking or brain surgery.

  32. Hello I recently discoverred that my flash is not working in FF.
    The flssh can be seen on http://www.villasud.nl, and is located right above the menu. In IE it works fine, in FF not at all just a nice white area…. Can anyone tell me what to do do solve this ?
    Robin

  33. I’m one more person who has pulled his hair one time or other on this issue (embedding flash + standards compliant + cross browser + “graceful degradation”).

    Everything around leads me to think that SWFObject2 is the way to go. There is the dual embedding method/javascript dependence issue, but now that it seems Microsoft/Eolas patent thing has been settled, maybe the dynamic method isn’t needed anymore?

    Is there a ‘perfect’ solution that takes into account every possible scenario, with appropriate alternative content (v.g., Flash movie for minimal plugin version, JPEG + link for old plugin version, different link for javascript disabled, etc…)

    I feel a lack of a recent article (end of 2008 or beginning of 2009) on this subject, one really authoritative, by someone of the kind of (say) Mr. Zeldman.

  34. I don’t understant why you nest 2 <object>, I understand that it is possible but what is the advantage vs such a code :

    <!–[if IE]>
    <object classid=”clsid:D27CDB6E-AE6D-11cf-96B8-»
    444553540000″ width=”300″ height=”120″> –>
    <!–[if !IE]>–>
    <object type=”application/x-shockwave-flash” »
    data=”myContent.swf” width=”300″ height=”120″>
    <!–Alternative content

    </object>

    On my android system, I have a problem with your solution, the browser seems to fail to catch both second <object>.I find this solution but It’s so trivial that I’m sure there will be issues (but I didn’t find any for now), so can you explain why you nest both objects?

Got something to say?

We have turned off comments, but you can see what folks had to say before we did so.

More from ALA

Making Room for Variation

In this excerpt from Expressive Designs Systems, Yesenia Perez-Cruz goes deep on what it takes to create design systems that enables intentional, meaningful variation.
Design