背景介紹:
最近在搞一個(gè)項(xiàng)目,涉及到圖片選取,裁剪,上傳等,由于瀏覽器安全性問(wèn)題,js無(wú)法獲取到<input type="file">中選取的文件路徑,而且對(duì)照片的裁剪,摳圖等由HTML5實(shí)現(xiàn)的功能,對(duì)各大瀏覽器的兼容性,真是不敢太大膽。這個(gè)時(shí)候就引進(jìn)了flash,然后所有js做不了的讓flash來(lái)做,然后由js來(lái)控制頁(yè)面元素。就這樣開(kāi)始了js與as的交互之旅,聽(tīng)做flash的大叔說(shuō),flash調(diào)js的函數(shù)式很好調(diào)的,而js調(diào)as不大容易。最終的情況是as調(diào)js錯(cuò)誤層出不窮,花費(fèi)了很多時(shí)間在上面,當(dāng)然了,期初js調(diào)as也走了彎路,因?yàn)橹皼](méi)有跟flash打過(guò)交道,所以只能任由別人說(shuō)了,但是貌似還不是咱們js的問(wèn)題,因?yàn)榫W(wǎng)上現(xiàn)成的方法就很多的了,廢話不多說(shuō),把項(xiàng)目中js調(diào)用as的代碼共享出來(lái)。
重要內(nèi)容
//獲取flash對(duì)象
function getSWF(name){
var e=document.getElementById(name);
return (navigator.appName.indexOf("Microsoft") != -1)?e:e.getElementsByTagName("embed")[0];
}
為什么要這樣呢,因?yàn)樵跒g覽器中嵌入flash一般采用如下格式:
<object>
<embed></embed>
</object>
因?yàn)镮E(微軟家的),其他(Mozilla家的火狐,谷歌家的chrome等等)在對(duì)HTML文檔進(jìn)行解析的時(shí)候存在差異,所以如果面對(duì)不同的瀏覽器,通用一個(gè)方法,自己都不知道錯(cuò)在哪里,但是你真的錯(cuò)了!
代碼詳解
上面的函數(shù)getSWF()顧名思義,就是獲取文檔中嵌入的flash對(duì)象,navigator是瀏覽器對(duì)象,Navigator 對(duì)象中包含有關(guān)瀏覽器的信息。
相關(guān)的信息可參考:http://www.w3school.com.cn/jsref/dom_obj_navigator.asp;
所以后面的appName就是Navigator對(duì)象中叫“appName”的屬性,這個(gè)屬性記錄了navigator.appName獲取到的是瀏覽器的名稱,當(dāng)前5大主流瀏覽器的appName值如下:
IE: 瀏覽器名稱:Microsoft Internet
FF,Chrome,Opera,Safari: 瀏覽器名稱:Netscape
瀏覽器appName測(cè)試地址:http://www.w3school.com.cn/tiy/t.asp?f=hdom_browser;
indexOf()是Javascript函數(shù),indexOf() 方法可返回某個(gè)指定的字符串值在字符串中首次出現(xiàn)的位置
stringObject.indexOf("str",num);stringObject就是被查找的字符串對(duì)象,str是要查找的字符串,num是起始位置,如果查詢到了“str”字符串存在于stringObject中,則返回第一個(gè)出現(xiàn)的位置,如果要檢索的字符串值沒(méi)有出現(xiàn),則該方法返回 -1;
var e = document.getElementById(name); 是獲取文檔中屬性id的值為name的節(jié)點(diǎn)對(duì)象,并把這個(gè)對(duì)象賦給e,
return (navigator.appName.indexOf("Microsoft") != -1)?e:e.getElementsByTagName("embed")[0];看上去好像很復(fù)雜,起始很簡(jiǎn)單的,這里是一個(gè)三木運(yùn)算(學(xué)過(guò)編程的都應(yīng)該知道),具體的格式為 if(a)?b:c;意思就是當(dāng)if(a)為true時(shí)取值為b,if(a)不為true時(shí),取值為c??梢园堰@句長(zhǎng)長(zhǎng)的代碼分解成if(a)?b:c;的格式
navigator.appName.indexOf("Microsoft")!=-1 e e.getElementsByTagName("embed")[0] 這三個(gè)部分
if(navigator.appName.indexOf("Microsoft")!=-1){ alert("我的瀏覽器不是IE內(nèi)核的"); }else{"我的瀏覽器是IE內(nèi)核的"}
當(dāng)彈窗為“我的瀏覽器不是IE內(nèi)核的” 的時(shí)候說(shuō)明我的瀏覽器的名稱中沒(méi)有包含“Microsoft”,就是說(shuō)沒(méi)有用IE瀏覽器,這個(gè)時(shí)候要獲取的flash對(duì)象就是文檔中的<object></object>對(duì)象,如果是IE瀏覽器,則獲取到的是<embed></embed>這個(gè)對(duì)象,無(wú)論獲得那個(gè)對(duì)象,最終都要用return返回給調(diào)用的函數(shù),這樣就可以在不同的瀏覽器里獲得相對(duì)應(yīng)的flash對(duì)象。
整體方案:
獲取了flash 對(duì)象之后就可以調(diào)用flash里面的方法,或者flash里面的屬性了。
var objName = getSWF("FlashToJS");
//調(diào)用對(duì)象的flash_selFiles方法
if(objName){
objName.flash_cutPic(arg);
}else{
console.log("沒(méi)有獲取到對(duì)象");
}
這就調(diào)到了flash里里面的flash_selFiles()方法。
最后的感言
在頁(yè)面中還是盡量減少使用flash,特別是別對(duì)flash太過(guò)于依賴,在as與js的交互中還是隱藏著很多的陷阱的。報(bào)告完畢!