在 HTML 裏嵌入文本和圖片以外的事物,就會用到嵌入標籤,而嵌入標籤在各瀏覽器之間的不統一,一直是讓開發人員很頭痛的問題。一切都要從嵌入 SUN 公司的 Applet Java 小程序開始。小程序
當時,對於 Applet 的嵌入,瀏覽器老大哥 Netscape 公司是使用 embed 標籤的,embed 標籤的好處就是嵌入一個對象只須要一對標籤,全部參數都寫入該標籤的屬性,很是方便。而微軟和其餘瀏覽器廠商都使用 applet 專用標籤,主標籤只有幾個固定的屬性,那些和嵌入內容有關的屬性都放在子標籤 param 裏(param 只有 name、value 這類固定屬性),這種組合標籤,就是 object 標籤的前身。瀏覽器
以後,隨着 Flash、視頻、音頻這些多媒體元素在網站上的出現,embed 標籤的功能被擴展了,用於嵌入這些多媒體元素——原先 embed 標籤就有一個 type 屬性,利用 MIME 分辨嵌入內容的類型——這是一個很是好的功能,使得非 Applet 的內容也能被識別,並且 MIME 的法則自己就不受瀏覽器和操做系統的限制。安全
此時的微軟,正在 ActiveX 技術普及的時期,applet 這種標籤名範圍太窄,因而就大力推行泛用的 object 標籤,專門用於 ActiveX 控件的嵌入。object 標籤幾乎和 applet 同樣,只是多了 clsid、codetype 等屬性,主要用來來判別嵌入內容的類型。ActiveX 是一把雙刃劍,雖然極易開發和使用,可是倒是 Windows Only 的技術;並且連 Firefox 的 Windows 版都不支持它,因此在瀏覽器行業 ActiveX 簡直是 IE Only…… 因而各大瀏覽器廠商都倒向以往被冷落的 embed,只是……被 W3C 承認的是 object,而不是 embed,由於 embed 的屬性是根據嵌入內容類型的不一樣而不一樣的(實質上是針對「嵌入內容解讀插件」而寫的屬性),沒法定死,對於標準來講這就是硬傷。app
下 面,我針對 embed 與 object 標籤在 IE6 和 FF3 for Windows 之間作了對比測試。方法是,嵌入了一個 Flash(swf 文件,MIME 爲 application/x-shockwave-flash)和一個音頻(mp3 文件,MIME 爲 audio/mpeg),分別寫成四種形式的 HTML 給兩個瀏覽器瀏覽:
1,兩個嵌入都使用 embed;
2,兩個嵌入都使用 object(只靠 clsid 識別);
3,兩個嵌入都使用 object(同時使用 clsid 與 codetype 識別);
4,兩個嵌入都使用 object(只靠 codetype 識別)。
IE6 的結果爲:
1——兩個嵌入都正常(mp3 默認是 WMP 的 ActiveX 控件打開;若 QuickTime ActiveX 控件註冊了mp3 的 MIME,則由 QuickTime ActiveX 控件打開,且可能有安全警告);
2——兩個嵌入都正常(clsid 填寫哪一個 ActiveX 控件的,就用哪一個打開);
3——兩個嵌入都正常(clsid 填寫哪一個 ActiveX 控件的,就用哪一個打開);
4——Flash 嵌入正常,mp3 音頻嵌入失敗(顯示成一個沒法輸入的文本框)。
FF3 的結果爲:
1——兩個嵌入都正常(mp3 默認沒法打開,除非 type 屬性改用 WMP 專用 MIME;若 QuickTime 插件註冊了mp3 的 MIME,則由 QuickTime 插件打開);
2——兩個嵌入都失敗(空白);
3——兩個嵌入都失敗(空白);
4——兩個嵌入都失敗(空白)。測試
測試結果是:embed 標籤兼容性較強,可是變數太多,對於小白瀏覽者來講就是噩夢;而 object 標籤果真是 IE Only。因此當年被 Macromedia 公司所提倡的 object-embed 混合寫法是最安全的,雖然不符合 W3C 標準。網站
另針對 Windows Media Player ActiveX 控件。在 IE(包括馬甲)第一次在網頁上讀到含有媒體裝載的 embed 或 object 元素時,會給 IE 註冊相應的加載項,雖然註冊的名稱不一樣,可是文件都指向 wmp.dll 或 wmpdxm.dll。含有有效 clsid 的 object 元素將註冊名稱爲 Windows Media Player 的加載項;embed 元素則會根據文件 MIME 註冊成對應名稱的加載項(好比 wma 文件會註冊 AUDIO__X_MS_WMA Moniker Class,wmv 文件會註冊 VIDEO__X_MS_WMV Moniker Class,實際上這些 class 是本來就存在的,只是須要建立 MIME - CLSID 關聯並鏈入 iexplore)。當禁用已經生成的加載項,或者加載項註冊表被破壞時,其對應的 HTML 標籤將失去做用。ui