在使用JS時,我們?yōu)榱吮WC瀏覽器的兼容及通用性,我們需要對瀏覽器是否支持相應(yīng)插件進行檢測,接下來由南昌網(wǎng)站設(shè)計公司技術(shù)人員向大家介紹瀏覽器插件檢測方法及注意事項.
檢測瀏覽器中是否安裝了特定的插件是一種最常見的檢測例程。對于非IE瀏覽器,可以使用plugins數(shù)組來達到這個目的。該數(shù)組中的每一項都包含下列屬性:
□name:插件的名字;
□description:插件的描述;
□filename:插件的文件名;
□length:插件所處理的MIME類型數(shù)量。
一般來說,name屬性中會包含檢測插件必需的所有信息,但有時候也不完全如此。在檢測插件時,需要像下面這樣循環(huán)迭代每個插件并將插件的name與給定的名字進行比較:
//檢測插件(在IE中無效)
function hasPlugin( name){
name=name.toLowerCase();
for (var i=0; i if (navigator. plugins[i].name. toLowerCase().indexOf (name)>-1)(
return true;
}
}
return false;
}
//檢測Flash
alert (hasPlugin("Flash"));
//檢測 QuickTime
alert (hasPlugin("QuickTime"));
//檢測Java
alert (hasPlugin( "Java"));
這個hasPlugin()函數(shù)接受一個參數(shù):要檢測的插件名。第一步是將傳人的名稱轉(zhuǎn)換為小寫形式,以便于比較。然后,迭代plugins數(shù)組,通過indexOf()檢測每個name屬性,以確定傳人的名稱是否出現(xiàn)在字符串的某個地方。比較的字符串都使用小寫形式可以避免因大小寫不一致導(dǎo)致的錯誤。而傳人的參數(shù)應(yīng)該盡可能具體,以避免混淆。應(yīng)該說,像Flash和QuickTime這樣的字符串就比較具體了,不容易導(dǎo)致混淆。在Firefox、Safari、Opera和Chrome中可以使用這種方法來檢測插件。
檢測IE中的插件比較麻煩,因為IE不支持Netscape式的插件。在IE中檢測插件的唯一方式就是使用專有的ActiveXObject類型,并嘗試創(chuàng)建一個特定插件的實例。IE是以COM對象的方式實現(xiàn)插件的,而COM對象使用唯一標識符來標識。因此,要想檢查特定的插件,就必須知道其COM標識符。例如,F(xiàn)lash的標識符是ShockwaveFlash.ShockwaveFlash。知道唯一標識符之后,就可以編寫類似下面的函數(shù)來檢測IE中是否安裝相應(yīng)插件了:
//檢測IE中的插件
function hasIEPlugin (name){
try{
new ActiveXObj ect (name);
return true;
} catch(ex){
return false;
}
}
//檢測Flash
alert (hasIEPlugin("ShockwaveFlash. ShockwaveFlash"))
//檢測 QuickTime
alert( hasIEPlugin("QuickTime. QuickTime“));
在這個例子中,函數(shù)hasIEPlugin()只接收一個COM標識符作為參數(shù)。在函數(shù)內(nèi)部,首先會嘗試創(chuàng)建一個COM對象的實例。之所以要在try-catch語句中進行實例化,南昌網(wǎng)絡(luò)公司技術(shù)員提示大家是因為創(chuàng)建未知COM對象會導(dǎo)致拋出錯誤。這樣,如果實例化成功,則函數(shù)返回true;否則,如果拋出了錯誤,則執(zhí)行catch塊,結(jié)果就會返回false。例子最后檢測IE中是否安裝了Flash和QuickTime插件。
鑒于檢測這兩種插件的方法差別太大,因此典型的做法是針對每個插件分別創(chuàng)建檢測函數(shù),而不是使用前面介紹的通用檢測方法。來看下面的例子:
//檢測所有瀏覽器中的Flash
function hasFlash()(
var result=hasPlugin("Flash");
if(!result){
result=hasIEPlugin("ShockwaveFlash. ShockwaveFlash");
}
return result;
}
//檢測所有瀏覽器中的QuickTime
f unc tion hasQuickTime(){
var result=hasPlugin("QuickTime");
if(!result){
result=hasIEPlugin("QuickTime. QuickTime");
}
return result;
}
//檢測Flash
alert(hasFlash());
//檢測 QuickTime
alert (hasQuickTime());
上面代碼中定義了兩個函數(shù):hasFlash()和hasQuickTime()。每個函數(shù)都是先嘗試使用不針對IE的插件檢測方法。如果返回了false(在IE中會這樣),那么再使用針對IE的插件檢測方法。如 果IE的插件檢測方法再返回false,則整個方法也將返回false。只要任何一次檢測返回true,整個方法都會返回true。
plugins集合有一個名叫refresh()的方法,用于刷新plugins以反映最新安裝的插件。這個方法接收一個參數(shù):表示是否應(yīng)該重新加載頁面的一個布爾值。如果將這個值設(shè)置為true,則會重新加載包含插件的所有頁面;否則,只更新plugins集合,不重新加載頁面。
本文僅限內(nèi)部技術(shù)人員學(xué)習(xí)交流,不得作于其他商業(yè)用途.文章出自:南昌網(wǎng)站建設(shè)公司-百恒網(wǎng)絡(luò) http://m.gimmickmag.com 如轉(zhuǎn)載請注明出處!