1.SWFObject是什么?
- SWFObject 2提供兩種優化flash播放器的嵌入方法:基於標記的方法和依賴於js的方法。
- SWFObject 2提供一個js的API,為嵌入SWF文件和獲取Flash播放器的相關信息提供了一個完整的工具箱。
- 只用了一個很小的js文件 (10Kb / GZIPed: 3.9Kb)。
- 是SWFObject 1.5, UFO and the Adobe Flash Player Detection Kit的繼承者。
- 擬統一所有現有的Flash播放器的嵌入方法,並提供了嵌入Adobe Flash Player內容新的標准
2.我們為什么要用SWFObject?
- 比現在其他的flash嵌入方式要靈活和更加優化。
- 給任何人提供了解決方案:不管你是html開發者還是flash或者js開發者,都有對應的方法可用。
- 打破了設定在供應商特定的標記,促進web標准和替代內容的使用。
- 使用不顯眼的JavaScript和JavaScript最佳實踐。
- 容易使用。
3.為什么SWFObject使用JavaScript?
SWFObject使用js來克服那些單獨用標記無法解決的問題:
- 檢測Flash播放器版本,並確定是否應該顯示Flash內容或替代內容,以避免過時的Flash插件讓Flash內容無法顯示。
- 萬一flash插件版本太低,通過dom操作可以顯示默認的替換內容,給用戶提供信息。(注意:如果flash插件沒有安裝,dom對象元素自動會顯示替代內容)
- 提供選項,用於快速安裝的Adobe下載最新的Flash Player
- 提供一個JavaScript API來執行常見的Flash播放器和Flash內容相關的任務
4.我應該使用靜態的還是動態的方法發布?
SWFObject2提供兩種不同的方法來嵌入Flash Player內容:
- 靜態發布的方法用標准的標記嵌入flash內容和替代元素,並使用js來解決那些單獨用標記無法解決的問題。
- 動態發布方法是基於標記的替代內容,通過js用flash來替換替代內容,前提是當前flash版本和js支持(像之前的 SWFObject版本和UFO)。
- 靜態發布的優勢:
- 促進實際制作符合標准的標記
- 最佳嵌入性能
- 嵌入Flash內容的機制,不依賴於腳本語言,所以flash內容可以被更多的人看到(兼容性更好)
- 如果你有Flash插件安裝,但已禁用JavaScript或使用的瀏覽器不支持JavaScript,您將仍然能夠看到你的Flash內容
- flash可以運行在對js支持非常糟糕的設備上,比如sony的psp。
- RSS閱讀器等自動化工具能夠抓到Flash內容
-
動態發布的優勢:
-
它與腳本的應用程序很好地集成在一起,能夠使動態變量(flashvars)
-
它避免了點擊激活機制激活活動內容在Internet Explorer6/7和Opera9+。請注意,微軟已經淘汰了其Internet Explorer瀏覽器的最活躍的內容
-
5.如何使用SWFObject的靜態方法嵌入Flash Player內容?
步驟1:使用符合標准的標記嵌入Flash內容和替代內容
SWFObject的基礎標記使用嵌套對象的方法(用專有的IE條件注釋),確保僅標記手段的最優化跨瀏覽器支持,而作為符合標准和配套的替代內容。
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> 3 <head> 4 <title>SWFObject - step 1</title> 5 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 6 </head> 7 <body> 8 <div> 9 10 <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="780" height="420"> 11 <param name="movie" value="myContent.swf" /> 12 <!--[if !IE]>--> 13 <object type="application/x-shockwave-flash" data="myContent.swf" width="780" height="420"> 14 <!--<![endif]--> 15 <p>Alternative content</p> 16 <!--[if !IE]>--> 17 </object> 18 <!--<![endif]--> 19 </object> 20 21 </div> 22 </body> 23 </html>
注:嵌套對象方法需要一個雙對象定義(外部對象針對Internet Explorer和內針對所有其他的瀏覽器的對象),你需要定義你的對象屬性和嵌套的param元素兩次。
需要的屬性:
- classid(只用於外層元素,值一直是: clsid:D27CDB6E-AE6D-11cf-96B8-444553540000)
- type(只用於內層元素,值一直是: application/x-shockwave-flas)
- data(只用於內層元素,定義swf的路徑:data="myContent.swf")
- width(定義swf的寬度,內外都用到)
- height(定義swf的高度,內外都用到)
需要的參數:
- movie(只用於內層元素,定義swf的路徑:<param name="movie" value="myContent.swf" />)
- 注意:我們建議不要使用codebase屬性指向Adobe Flash插件安裝程序的URL的服務器,因為這樣是違法的,他限定了只能當前域來訪問。我們建議在替代內容中放一個提示信息,這樣用戶會有更好的體驗而不是下載flash。
你怎么使用HTML來配置你的Flash內容?
你能在標簽中加下面的屬性:
- id
- name
- class
- align
你能使用下面的參數:
- play
- loop
- menu
- quality
- scale
- salign
- wmode
- bgcolor
- base
- swliveconnect
- flashvars
- devicefont (more info)
- allowscriptaccess (more info here and here)
- seamlesstabbing (more info)
- allowfullscreen (more info)
- allownetworking (more info)
為什么你應該使用替代內容?
對象元素允許你在他里面放替換元素,在flash沒有安裝或者不被支持的時候會顯示。他的內容同樣也會被搜索引擎抓到,他是一個
用於創建搜索引擎友好的內容的非常好的工具。總而言之,你應該使用替換內容,當你想讓你創建的內容可以被沒有裝插件的用戶訪問,對搜索引擎友好,告訴訪問者對應提示,這樣會有更好的用戶體驗而不是直接去下載插件。
步驟2:包括JavaScript庫在你的HTML頁面的頭部
SWFObject庫是一個外部JavaScript文件。SWFObject一被加載就會被執行,一但dom元素加載完了就會執行dom操作,所有瀏覽器都支持他(
IE, Firefox, Safari and Opera 9+
),或者是onload事件被觸發。
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> 3 <head> 4 <title>SWFObject - step 2</title> 5 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 6 7 <script type="text/javascript" src="swfobject.js"></script> 8 9 </head> 10 <body> 11 <div> 12 <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="780" height="420"> 13 <param name="movie" value="myContent.swf" /> 14 <!--[if !IE]>--> 15 <object type="application/x-shockwave-flash" data="myContent.swf" width="780" height="420"> 16 <!--<![endif]--> 17 <p>Alternative content</p> 18 <!--[if !IE]>--> 19 </object> 20 <!--<![endif]--> 21 </object> 22 </div> 23 </body> 24 </html>
步驟3:用SWFObject庫注冊您的Flash內容,告訴SWFObject做什么
首先添加一個唯一的ID外部對象標記定義您的Flash內容,第二添加swfobject.registerObject的方法:
- 第一個參數(字符串,必需)指定標記中使用的ID。
- 第二個參數(字符串,必需)指定了你內容發布所需要的flash版本。它會激活Flash版本檢測,以確定是否顯示Flash內容或通過dom操作強制顯示替代內容。Flash的版本號通常由major.minor.release.build四部分組成,但是SWFObject只識別前三個數字,所以 "WIN 9,0,18,0" (IE) 或者 "Shockwave Flash 9 r18" (其他瀏覽器)都會被翻譯成 "9.0.18". 如果你只想測試主要版本,你可以省略次要和發行版本號,如“9”,而不是“9.0.0”。
- 第三個參數(字符串,可選),可用於啟動Adobe快速安裝,並指定您的快速安裝SWF文件的URL。快速安裝會顯示一個標准化的Flash插件下載對話框來替代你的Flash內容,當所需的插件版本不可用。一個默認的expressInstall.swf文件被一起打包在項目中。它也包含了相應的expressInstall.fla和AS文件(在SRC目錄),讓你創建自己的自定義快速安裝體驗。請注意,快速安裝只會觸發一次(他第一次被調用),他只被支持在win平台和mac平台的 Flash Player 6.0.65以上的版本,他會要求一個最小的尺寸是 310x137px。
- 第四個參數(js函數,可選)用來定義一個回調函數,當插件創建成功或者失敗都可以調用該函數來處理一些事。
-
1 <script type="text/javascript"> 2 swfobject.registerObject("myId", "9.0.115", "expressInstall.swf"); 3 </script>
小提示:
- 用SWFObject HTML和js生成器來幫助你編寫代碼。
- 重復步驟1和3,把多個SWF文件嵌入到一個HTML頁面
- 引用活動對象元素的最簡單的方法是使用JavaScript API:swfobject.getObjectById(objectIdStr
6.如何使用SWFObject的動態方法嵌入Flash Player內容?
步驟1:使用符合標准的標記,創建替代內容
SWFObject動態嵌入的方法遵循漸進增強的原則,當有足夠的js和flash插件支持的時候會用flash替代替換的內容。首先定義替代的內容,用一個id標記他。
步驟2:包括JavaScript庫在你的HTML頁面的頭部
SWFObject庫是一個外部JavaScript文件。SWFObject一被加載就會被執行,一但dom元素加載完了就會執行dom操作,所有瀏覽器都支持他(
IE, Firefox, Safari and Opera 9+
),或者是onload事件被觸發。
步驟3:用JavaScript嵌入你的SWF
swfobject.embedSWF(swfUrl, id, width, height, version, expressInstallSwfurl, flashvars, params, attributes, callbackFn)有5個必須的參數和5個可選的參數。
- swfUrl (字符串, 必須) 指定您的SWF的URL
- id (String, required) 指定包含替換元素的html元素的ID,能用你的flash的內容來替換
- width (String, required) 指定SWF的寬度
- height (String, required) 指定SWF的高度
- version (String, required)指定SWF 發布所需的flash播放器的版本 (格式 is: "major.minor.release" or "major")
- expressInstallSwfurl (String, optional)指定快速安裝的路徑,激活快速安裝. 請注意,快速安裝只會觸發一次(他第一次被調用),他只被支持在win平台和mac平台的 Flash Player 6.0.65以上的版本,他會要求一個最小的尺寸是 310x137px。
- flashvars (Object, optional) 指定需要傳遞給flash的變量(用鍵值對)
- params (Object, optional) 指定嵌入對象的參數(用鍵值對)
- attributes (Object, optional) 指定對象的屬性(用鍵值對)
- callbackFn (JavaScript function, optional)能定義一個回調函數,不管調用flash創建成功或者失敗都可以調用該函數
小提示:
您可以省略可選參數,只要你不破壞參數順序。如果你不想使用某個參數但是想使用他下一個參數,可以把他的值設置為false,對於flashvars, params and attributes對象,也可以直接用空值{}。
如何配置flash?
您可以添加以下經常使用的可選屬性的對象元素:
- id (NOTE: 如果沒有定義會自動取替換元素容器的id)
- align
- name
- styleclass (see note about class)
- class
注意:class是
ECMA4中保留的關鍵字,在ie中會報錯,除非用引號把它括起來
(e.g. "class" or 'class')
。 出於這個原因,swfobject的提供作為一種安全的替代語法類的styleClass關鍵字,如果你使用的styleClass,swfobject的會自動插入class。
1 var attributes = { 2 id: "myId", 3 align: "left", 4 styleclass: "myclass" 5 };
如果你寧願用class代替styleClass,那么用引號括起來。
1 var attributes = { 2 id: "myId", 3 align: "left", 4 "class": "myclass" 5 };
你能使用下面可選的flash指定的參數:
- play
- loop
- menu
- quality
- scale
- salign
- wmode
- bgcolor
- base
- swliveconnect
- flashvars
- devicefont (more info)
- allowscriptaccess (more info here and here)
- seamlesstabbing (more info)
- allowfullscreen (more info)
- allownetworking (more info)
如何使用JavaScript對象來定義 flashvars, params and object's attributes?
最好使用對象表示法來定義對象:
1 <script type="text/javascript"> 2 3 var flashvars = {}; 4 var params = {}; 5 var attributes = {}; 6 7 swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0","expressInstall.swf", flashvars, params, attributes); 8 9 </script>
可以用鍵值對的方式寫:
1 var flashvars = { 2 name1: "hello", 3 name2: "world", 4 name3: "foobar" 5 };
也可以用".屬性"的方式寫:
1 var flashvars = {}; 2 flashvars.name1 = "hello"; 3 flashvars.name2 = "world"; 4 flashvars.name3 = "foobar";
也可以直接把參數內容加載swfobject.embedSWF()中。
1 <script type="text/javascript"> 2 swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0","expressInstall.swf", {name1:"hello",name2:"world",name3:"foobar"}, {menu:"false"}, {id:"myDynamicContent",name:"myDynamicContent"}); 3 </script>
如果你不想使用一個可選的參數,你可以把它定義為false或一個空對象
var flashvars = false;
var params = {};
FlashVars的對象是一個速記符號,為您的易用性。你可以忽略它,通過 params對象來指定你的flashvars。
1 <script type="text/javascript"> 2 var flashvars = false; 3 var params = { 4 menu: "false", 5 flashvars: "name1=hello&name2=world&name3=foobar" 6 }; 7 var attributes = { 8 id: "myDynamicContent", 9 name: "myDynamicContent" 10 }; 11 swfobject.embedSWF("myContent.swf", "myContent", "300", "120", "9.0.0","expressInstall.swf", flashvars, params, attributes); 12 </script>
從SWFObject 1.5 遷移到 SWFObject 2 的注意點
- SWFObject 2不能向后兼容到SWFObject 1.5
- 目前首選在你的HTML頁面的頭部插入所有腳本塊,增加到頁面body中可能會產生沖突(比如flash替代替換內容),因為js代碼執行被延后了。
- 庫本身都是用小寫的:swfobject,而不是SWFObject
- 方法只能通過庫訪問
- 此外,JavaScript API是完全不同的和更復雜的
- SWFObject 2替換整個替換標簽的內容,包括所引用的HTML容器元素,成為flash內容,只要js可用,flash版本支持。然而, SWFObject 1.5只替換替換表情容器內的內容。如果你沒有定義一個id屬性,對象元素會自動繼承包含元素中的id。
從UFO遷移到SWFObject 1.5 的注意點
- SWFObject 2替換整個替換標簽的內容,包括所引用的HTML容器元素,成為flash內容,只要js可用,flash版本支持。然而, UFO只替換替換表情容器內的內容。如果你沒有定義一個id屬性,對象元素會自動繼承包含元素中的id。
- UFO's setcontainercss 特征在 SWFObject 2 中沒有被納入。
SWFObject 2是不是支持MIME type application/xhtml+xml?
SWFObject的2不支持XML MIME類型,這是一個設計決定。
有以下原因:
- 只有很少(不顯着)web開發者使用
- 我們不能確定它走的方向,ie不支持他,其它主要瀏覽器廠商都瞄准了一個新的html解析的標准(html5),他與當前w3c解析的方式不同。
- 不支持他我們節省了大量的文件和努力。
