關於我的SWFObject V1.5的使用過程,以上篇中的介紹暫時告一段落了,下面我將會帶領SWFObject V2.1出場與大家見面,如果我早一點結識V2.1的話,或許就不會受到“等待HTML DOM加載”問題的侵擾了。
首先,給大家簡要介紹一下V2.1語法的調用示例:
復制代碼代碼如下:
<script type="text/javascript" src="swfobject.js"></script>
<script type="text/javascript">
//1、使用Json初始化變量、參數、屬性
var flashvars = {
name1: "hello",
name2: "world",
name3: "foobar"
};
var params = {
menu: "false"
};
var attributes = {
id: "dynamicContent2",
name: "dynamicContent2"
};
swfobject.embedSWF("test6_flashvars.swf", "content2", "300", "120", "6.0.0", "expressInstall.swf", flashvars, params, attributes);
//2、傳統的初始化設置,效果一樣
var flashvars = {};
flashvars.name1 = "hello";
flashvars.name2 = "world";
flashvars.name3 = "foobar";
var params = {};
params.menu = "false";
var attributes = {};
attributes.id = "dynamicContent3";
attributes.name = "dynamicContent3";
swfobject.embedSWF("test6_flashvars.swf", "content3", "300", "120", "6.0.0",
"expressInstall.swf", flashvars, params, attributes);
//3、直接寫在後面,就一句話,簡潔剽悍,不拖泥帶水
swfobject.embedSWF("test6_flashvars.swf", "content5", "300", "120",
"6.0.0", "expressInstall.swf", {name1:"hello",name2:"world",name3:"foobar"}, {menu:"false"}, {id:"dynamicContent5",name:"dynamicContent5"});
</script>
從我個人來講,我比較喜歡上面的第三種寫法,下面即將提到,我在HTML代碼中嵌入Flash文件的最終解決方案中,就是采取的第三種風格調用的swfobject.embedSWF()。V2.1版本的風格非常符合現代JS的風格,代碼顯得更為簡潔。
上篇中采取的解決方案看來,似乎已經能夠滿足大部分需求,而且兼容性似乎也還過得去,理應能夠滿足絕多數朋友的需求,也未嘗不可是一個過得去的解決方案。但是,有一種比較極端的情況被我發現,就是在:
復制代碼代碼如下:
new SWFObject("http://www.pec365.com/Flash/20071113.swf", "mymovie", "304", "367", "7", "#FFFFFF");
的時候,如果傳入的Flash文件的地址有誤,又或者該Flash文件在服務器中被刪除掉了,那麼你將看到一種最不願意看到的情況,示例
如下:
復制代碼代碼如下:
<html>
<title>DEMO</title>
<head>
<script type="text/javascript" src="swfobject_source.js"></script>
</head>
<body>
<form id="Form1">
<div id="flashcontent">
<a href="http://www.adobe.com/go/getflashplayer">
<img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" border="0" />
</a>
</div>
</form>
<script type="text/javascript">
// 注意,我在Flash文件名前加了一個f
var so = new SWFObject("http://www.pec365.com/Flash/f20071113.swf", "mymovie", "304", "367", "7", "#FFFFFF");
so.write("flashcontent");
</script>
</body>
</html>
建議您親自執行一下這段代碼,如果您是一名新手可參見上篇中說介紹的步驟來運行一下這段代碼,真實的感受一下“災難”的降臨。
是的,您將看到頁面上一片空白,那原本用於替換不能顯示Flash時備用的圖片也不見了,去了哪裡呢?我經過調試後發現,縱使因為傳入的Flash文件地址錯誤,也會創建一個錯誤的<object [……]></object>標簽將<div id="flashcontent">[……]</div>中的內容替換掉,從而就是你看到的,將形成一個高寬分別為304px和367px的空白區域(如果安裝了Flash播放器,在屏幕左上角點擊鼠標右鍵,您會有所發現),於是噩夢就如此降臨了。
為了解決這個噩夢般的結果,於是乎,我就想到一個馊主意,首先檢查一下根據傳入的Flash文件地址檢查一下服務器上是否真的存在該文件,如果返回的結果是該Flash文件存在,那麼就執行swfobject.embedSWF()方法,而具體的思路就是利用XMLHttpRequest 對象,通過GET/HEAD方式請求服務器,然後判斷xmlHttp.status == 200 || xmlHttp.status == 302作為文件存在的依據,但是這種方式似乎還是存在一定的缺陷,暫時我還沒有能力完善,現將我最終的解決方案示例如下:
復制代碼代碼如下:
<html>
<title>DEMO</title>
<head>
<script language="javascript" type="text/javascript" src="JavaScript/swfobject.js"></script>
<script type="text/javascript">
(function() {
var xmlHttp,
result,
flashURL = "http://www.pec365.com/Flash/20071113.swf";
var checkFlashURL = function(url) {
xmlHttp = GetXmlHttpObject();
xmlHttp.onreadystatechange = function() {
if ( xmlHttp.readyState == 4 ) {
if ( xmlHttp.status == 200 ||
xmlHttp.status == 302 ) {
return (result = true);
}
}
};
xmlHttp.open("HEAD", url, true);
xmlHttp.send(null);
};
var GetXmlHttpObject = function() {
var xmlHttp = null;
try {
// Firefox, Opera 8.0+, Safari
xmlHttp = new XMLHttpRequest();
}
catch (e) {
// Internet Explorer
try {
// Older IE
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
// New IE
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
}
return xmlHttp;
};
// 就是用於檢查服務器上指定的Flash文件是否存在
checkFlashURL(flashURL);
window.onload = function() {
if ( result ) {
swfobject.embedSWF(flashURL, "flashcontent", "304", "367", "10.0.0", "expressInstall.swf", {}, { quality:"autohigh", wmode:"transparent" }, {});
}
else {
window.alert("您的Flash地址無效,請仔細檢查"); // 只是用於調試時檢查Flash地址地否正確
}
}
})();
</script>
</head>
<body>
<form id="Form1">
<div id="flashcontent">
<a href="http://www.adobe.com/go/getflashplayer">
<img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" border="0" />
</a>
</div>
</form>
</body>
</html>
哇,用了數小時在把這兩篇文字折騰好,不小心在公司呆到快22點了,保安來趕人了,想草草收場吧,明天上班得空再來雕琢一下文字,呵呵。