SWFObjectを使ったFlashの貼り方。
- documentation - swfobject - Embedding Adobe Flash Player content using SWFObject 2 - SWFObject is an easy-to-use and standards-friendly method to embed Flash content, which utilizes one small JavaScript file - Google Project Hosting
- SWFObject v2.0 ドキュメント日本語訳|Media Technology Labs (MTL) : メディアテクノロジーラボ
- http://swfobject.googlecode.com/svn/trunk/swfobject/src/swfobject.js ソース
- F-site | 「SWFObject」作者曰く、「日本のWebデザインはすごくクールで最高」 インタビュー。非常に参考になる。
選択肢
- 選択肢1 static publishing methodを使う。
- 選択肢2 dynamic publishing methodを使う。
- 選択肢2-1 ページ先頭でswfobjectを読み込む。ドキュメントで説明されている方法。
- 選択肢2-2 ページ末尾でswfobjectを読み込む。
上の方がHTML的に(SEO的にも?)正しい。下の方がHTMLがシンプル。
選択肢1 static publishing methodを使う。
JavaScriptなしでも表示可能なマークアップを目指すやり方。
- HTMLの先頭でSWFObjectを読み込み、swfobject.registerObject(...)を実行する。
- Flashを貼りたい位置に決められたマークアップを行う。
- パフォーマンスがよい。
- マークアップが標準準拠。
- 見た目はクリーンではない。
- 二重のオブジェクトタグ。
- classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
- <!--[if !IE]>--> が2回登場。
- 静的ならSWFObjectは何をするのか?
- マークアップだけでは解決できない問題を解決しているらしい。
- アップデートされていないIEで「このコントロールをアクティブ化して使用するにはクリックしてください」のメッセージが表示される場合がある。
- JavaScriptでFlashにパラメータ(flashvars)を渡せない。JavaScript無しでもFlashは見えてしまう。
- param要素で静的にflashvarsを渡すことはできる。
- ドキュメントには、二重のobjectのそれぞれにparamを書かなければならないとある。
- NOTE: The nested-objects method requires a double object definition (the outer object targeting Internet Explorer and the inner object targeting all other browsers), so you need to define your object attributes and nested param elements twice.
- 「ノート: ネストしたobjectsメソッドは、二重のobject定義が必要(外側がIE用、中がIE以外用)なので、objectの属性とparam要素は2回必要です」
- これは本当?param要素は1回書けば済むように思える。
- http://groups.google.com/group/swfobject/browse_thread/thread/8f071313edb37df6 でparamは1回書けばいいんじゃないかという議論がされている。
選択肢2-1 HTML先頭でdynamic publishing methodを使う。
JavaScriptでFlash用のHTMLソースを動的に生成するやり方。
- HTMLの先頭でSWFObjectを読み込み、swfobject.embedSWF(...)を実行する。
- CSSを生成して対象のdivを一旦隠し、Flashを貼ってからもう一度表示する仕組みになっている。
- 代替コンテンツが勝手に見えたりはしない。
- 下の選択肢2-2と違い、ドキュメントに書かれている。正統なやり方。
- SWFObjectのパッケージに含まれる expressInstall.swf を忘れずにアップロードする。
選択肢2-2 HTML末尾でdynamic publishing methodを使う。
ドキュメントではHTMLの先頭でswfobjectを実行することになっているが、HTMLの末尾にJavaScriptをまとめたいことも多い。以下のように書くとうまく動いた。
<html><body> <div id="(Flash表示領域のID)"> <noscript>((1) JavaScriptがオフの場合の表示)</noscript> ((2) 下のスクリプトが実行されるまでの代替コンテンツ。一瞬見えてしまう。何も書かなくてもよい。) </div> : : <!-- ページの一番下で --> <script type="text/javascript" src="http://www.google.com/jsapi"></script> <script type="text/javascript"> // Googleから読み込む。 google.load("swfobject", "2.2"); if (! swfobject.hasFlashPlayerVersion("(必要なFlashのバージョン 10.0.0など)")) { document.getElementById("(Flash表示領域のID)").innerHTML = "((3) プラグインが古い場合の表示。また、(4) ユーザが expressInstall での更新を拒否した場合の表示)"; } swfobject.embedSWF( "((5) 表示したいFlash).swf", "(Flash表示領域のID)", "(幅)", "(高さ)", "(必要なFlashのバージョン)", "(expressInstall.swfのパス。要アップロード)", (Flashに渡すパラメータ), (プラグイン用のパラメータ), (HTMLタグに追加する属性) ); </script> </body></html>
最後に expressInstall.swf をアップロードして完了。
どんな場合に何が表示されるのか。
- (1) JavaScriptがオフの場合。 → <noscript>を表示。
- (2) JavaScriptがオンで、ページ下部のスクリプトがロード・実行されるまでの間。 → <div>の中身を表示。
- (3) JavaScriptがオンで、Flashプラグインが入っていない場合。→ if内で指定したinnerHTMLの内容を表示。
- (4) Flashプラグインが入っているが古く、ユーザがexpressInstall.swfでのアップデートを拒否した場合。→ 上と同じ。if内で指定したinnerHTMLの内容を表示。
- (5) 新しいプラグインが入っている場合。または、expressInstall.swfで更新した場合。→ embedSWFで指定したswfを表示。
以下の環境で確認した。この他でもSWFObjectが動くなら動くのでは。
バリエーション
Flashが表示される前に代替コンテンツが見えて構わないなら、<div>に直に書くほうがいい。(3)(4)のif文は不要になる。内容によっては <noscript> も不要かもしれない。