簡潔短小的 JavaScript IE 瀏覽器判定代碼
更新時間:2010年03月21日 23:39:41 作者:
IE瀏覽器不管是什么版本,總是跟Web標準有些不太兼容。對于代碼工作者來說,自然是苦不堪言,為了考慮IE的兼容問題,不管是寫 CSS 還是 JS,往往都要對 IE 特別對待,這就少不了做些判斷。本文不討論如何區(qū)分 IE 的樣式,僅是 JS 判定 IE 瀏覽器。
這個目前世界上最短的 Javascript 判定 IE 瀏覽器的方法來自俄羅斯!它已經(jīng)在各版本的 IE 以及目前其他流行的瀏覽器上經(jīng)過測試,基于 IE 的 Bug,微軟雖然已經(jīng)意識到,但是從來沒有糾正過。
<script type='text/javascript'>
var ie = !-[1,];
alert(ie);
</script>
以上代碼運行結果:IE 下返回true,其他標準瀏覽器返回false。!-[1,],僅僅只有 6 bytes!
不過如果反過來判斷,標準瀏覽器返回 true 而 IE 返回 false的話,則可以再縮短一個byte。
<script type='text/javascript'>
notIe = -[1,];
if(-[1,]){
// 標準瀏覽器代碼
}else{
// IE Only的代碼
}
</script>
看完了這些,你們是不是很好奇這些是怎么運行的?請繼續(xù)看下文。
這個 Bug 產(chǎn)生的原因是 IE 會添加一個空數(shù)組元素到數(shù)組元素的總數(shù)里。
[1,]. Length標準瀏覽器會返回 1 (基于標準的 ECMAscript ,在數(shù)組最后的逗號”,”會被忽略,這是為了方便在一列里顯示以及自動生成等),但是 IE 會返回 2。當你打印這個數(shù)組的時候 IE 將會返回 “1, “,也就是兩個元素,而其他標準瀏覽器將會返回 “1″。
這很容易驗證,比如在 IE 和 FF中運行以下代碼:
<script type='text/javascript'>
alert([,]==',');
//這是8個字符判定IE
</script>
[1,]實際上瀏覽器的操作是toString()轉換成字符串的操作,-[1,]是將字符串強制轉換為數(shù)字。而 IE 將會返回 NaN,但是遺憾的是 NaN 并不是一個數(shù)字,因為[1,]轉換成字符串后的”1,”里面帶有逗號。而其他標準瀏覽器會返回 -1,這是一個非 0 的數(shù)字。
你知道,NaN 轉換成 Boolean 型將返回 false,所以-[1,]在 IE 下將返回 false。而任何非 0 的數(shù)字轉換成 Boolean 型(例如-1),在 標準瀏覽器下都將返回 true。所以我們得到了一個判定結果,!-[1,]在 IE 下返回true,而在其他標準瀏覽器下返回 false。也就達到了區(qū)分判定 IE 瀏覽器的目的。
當然,如前文所說,這個 Bug 其實微軟很早就已經(jīng)知道,但是卻一直沒有去修復它,所以在未來的 > IE8 的 IE 瀏覽器也就不確定是否依舊可以,不過基本上這么多代的 IE 都沒有修復,未來的 IE 也不太會去修復的樣子。
以下是其他的一些區(qū)分判定 IE 瀏覽器的代碼,也可以參考下:
<script type='text/javascript'>
// Option from Dean Edwards:
var ie = /*@cc_on!@*/false;
// Use the commented line:
var ie//@cc_on=1;
// Variation (shorter variable):
var ie = '\v'=='v';
/ / Option to Gareth Hayes (former record-holder):
var ie = !+"\v1";
</ script>
復制代碼 代碼如下:
<script type='text/javascript'>
var ie = !-[1,];
alert(ie);
</script>
以上代碼運行結果:IE 下返回true,其他標準瀏覽器返回false。!-[1,],僅僅只有 6 bytes!
不過如果反過來判斷,標準瀏覽器返回 true 而 IE 返回 false的話,則可以再縮短一個byte。
復制代碼 代碼如下:
<script type='text/javascript'>
notIe = -[1,];
if(-[1,]){
// 標準瀏覽器代碼
}else{
// IE Only的代碼
}
</script>
看完了這些,你們是不是很好奇這些是怎么運行的?請繼續(xù)看下文。
這個 Bug 產(chǎn)生的原因是 IE 會添加一個空數(shù)組元素到數(shù)組元素的總數(shù)里。
[1,]. Length標準瀏覽器會返回 1 (基于標準的 ECMAscript ,在數(shù)組最后的逗號”,”會被忽略,這是為了方便在一列里顯示以及自動生成等),但是 IE 會返回 2。當你打印這個數(shù)組的時候 IE 將會返回 “1, “,也就是兩個元素,而其他標準瀏覽器將會返回 “1″。
這很容易驗證,比如在 IE 和 FF中運行以下代碼:
復制代碼 代碼如下:
<script type='text/javascript'>
alert([,]==',');
//這是8個字符判定IE
</script>
[1,]實際上瀏覽器的操作是toString()轉換成字符串的操作,-[1,]是將字符串強制轉換為數(shù)字。而 IE 將會返回 NaN,但是遺憾的是 NaN 并不是一個數(shù)字,因為[1,]轉換成字符串后的”1,”里面帶有逗號。而其他標準瀏覽器會返回 -1,這是一個非 0 的數(shù)字。
你知道,NaN 轉換成 Boolean 型將返回 false,所以-[1,]在 IE 下將返回 false。而任何非 0 的數(shù)字轉換成 Boolean 型(例如-1),在 標準瀏覽器下都將返回 true。所以我們得到了一個判定結果,!-[1,]在 IE 下返回true,而在其他標準瀏覽器下返回 false。也就達到了區(qū)分判定 IE 瀏覽器的目的。
當然,如前文所說,這個 Bug 其實微軟很早就已經(jīng)知道,但是卻一直沒有去修復它,所以在未來的 > IE8 的 IE 瀏覽器也就不確定是否依舊可以,不過基本上這么多代的 IE 都沒有修復,未來的 IE 也不太會去修復的樣子。
以下是其他的一些區(qū)分判定 IE 瀏覽器的代碼,也可以參考下:
復制代碼 代碼如下:
<script type='text/javascript'>
// Option from Dean Edwards:
var ie = /*@cc_on!@*/false;
// Use the commented line:
var ie//@cc_on=1;
// Variation (shorter variable):
var ie = '\v'=='v';
/ / Option to Gareth Hayes (former record-holder):
var ie = !+"\v1";
</ script>
相關文章
getElementByIdx_x js自定義getElementById函數(shù)
最近看JS代碼,發(fā)現(xiàn)不少人問getElementByIdx_x是什么函數(shù),其實就是個getElementById自定義函數(shù)2012-01-01
JavaScript中實現(xiàn)new的兩種方式引發(fā)的探究
眾所周知JS中new的作用是通過構造函數(shù)來創(chuàng)建一個實例對象,這篇文章主要給大家介紹了關于JavaScript中實現(xiàn)new的兩種方式引發(fā)的相關資料,需要的朋友們下面隨著小編來一起學習學習吧2021-05-05
JavaScript 判斷iPhone X Series機型的方法
這篇文章主要介紹了JavaScript 判斷iPhone X Series機型的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01
基于uni-app開發(fā)刻度尺組件的實現(xiàn)示例
本文主要介紹了基于uni-app開發(fā)刻度尺組件的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03
給easyui的datebox控件添加清空按鈕的實現(xiàn)方法
下面小編就為大家?guī)硪黄oeasyui的datebox控件添加清空按鈕的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-11-11

