全世界最短的 JavaScript 判定 IE 瀏覽器!這個可以短!

全世界最短的JavaScript判定IE瀏覽器!
有些東西你想讓它長它並不一定就會如願,但是有一些東西你想讓它短也並不一定就會如願,這兩者都要看你的本事。對於我等IT民工來說,自然是代碼寫得越短越好。

你知道,IE是個腦殘兒瀏覽器,不管是什麼版本,縱使版本號越來越大,可總是讓人覺得這玩意兒跟標準老是扯不上曖昧。可是,你知道,只要世上還有 windows 操作系統,IE就永生不滅,阿門。對於代碼工作者來說,自然是苦不堪言,為了考慮IE的兼容問題,不管是寫 CSS 還是 JS,往往都要對 IE 特別對待,這就少不了做些判斷。本文不討論如何區分 IE 的樣式,僅是 JS 判定 IE 瀏覽器。

這個目前世界上最短的 Javascript 判定 IE 瀏覽器的方法來自一個俄人,又是俄人!它已經在各版本的 IE 以及目前其他流行的瀏覽器上經過測試,基於 IE 的 Bug,微軟雖然已經意識到,但是從來沒有糾正過。

<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>

看完了這些,你們是不是很好奇這些是怎麼運行的?請繼續看下文。

這個 Bug 產生的原因是 IE 會添加一個空數組元素到數組元素的總數里。

[1,]. Length

標準瀏覽器會返回 1 (基於標準的 ECMAscript ,在數組最後的逗號”,”會被忽略,這是為了方便在一列里顯示以及自動生成等),但是 IE 會返回 2。當你列印這個數組的時候 IE 將會返回 “1, “,也就是兩個元素,而其他標準瀏覽器將會返回 “1”。

這很容易驗證,比如在 IE 和 FF中運行以下代碼:

<script type='text/javascript'>
alert([,]==',');
//這是8個字元判定IE
</script>

[1,]實際上瀏覽器的操作是toString()轉換成字元串的操作,-[1,]是將字元串強制轉換為數字。而 IE 將會返回 NaN,但是遺憾的是 NaN 並不是一個數字,因為[1,]轉換成字元串後的”1,”裡面帶有逗號。而其他標準瀏覽器會返回 -1,這是一個非 0 的數字。

你知道,NaN 轉換成 Boolean 型將返回 false,所以-[1,]在 IE 下將返回 false。而任何非 0 的數字轉換成 Boolean 型(例如-1),在 標準瀏覽器下都將返回 true。所以我們得到了一個判定結果,!-[1,]在 IE 下返回true,而在其他標準瀏覽器下返回 false。也就達到了區分判定 IE 瀏覽器的目的。

當然,如前文所說,這個 Bug 其實微軟很早就已經知道,但是卻一直沒有去修復它,所以在未來的 > IE8 的 IE 瀏覽器也就不確定是否依舊可以,不過基本上這麼多代的 IE 都沒有修復,未來的 IE 也不太會去修復的樣子。

以下是其他的一些區分判定 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>

參考文章:
Самое короткое определение IE
32 bytes, ehr … 9, ehr … 7!!! to know if your browser is IE

  • 就算微軟修復了這個 bug … 對於我國很多用著關閉自動更新的 Windows 的同學來說也等於沒有…要等到 XP 真沒人用了才能淘汰老 IE 吧…

    • @Justice 在 360 及一些『「輿論」的蠱惑下,即使是 Win7 也會有大量的人關掉 Windows Update。

    • @任平生 但是 Win 7 下面至少不會去用 IE 6 吧…其他 IE 已經比 IE 6 好太多了…

    • sam

      @Justice
      IE6還能裝上嗎?

    • @sam 誰這麼神經在Win7下裝IE6啊,除非是調試用

  • win7快來洗滌 IE6吧!

  • 呵呵,真夠短的了,要是IE短命點更好

  • 用PHP或者HTML條件語句來不是更好嗎?

    • @bolo ….Javascript 裡面插php代碼?插html代碼?

    • @Leeiio 我意思是PHP通過瀏覽器請求頭信息來判斷IE,或者通過HTML條件判斷來做,不用JavaScript

    • @bolo JavaScript對於IE 和 其他標準瀏覽器在處理上是有些不同的,這裡只是前端代碼的區分,而且又不是所有的頁面都是php的。而如果用IE 條件判斷的html的話代碼就要寫兩份,有冗餘。

    • @Leeiio 嗯,這樣的話你介紹的方法只適合用作判斷是否讓IE執行後面的JavaScript了

    • @bolo 對,僅僅是前端代碼,不配合後台其其他代碼。

    • sam

      @bolo

      額。。好奇地問下,HTML條件語句怎麼判斷?

    • @sam
      <!–[if !IE]> 除IE外都可識別
      <!–[if IE]> 所有的IE可識別 < ![endif]-->
      <!–[if IE 5.0]> 只有IE5.0可以識別 < ![endif]-->
      <!–[if IE 5]> 僅IE5.0與IE5.5可以識別 < ![endif]-->
      <!–[if gt IE 5.0]> IE5.0以上版本都可以識別 < ![endif]-->
      <!–[if IE 6]> 僅IE6可識別 < ![endif]-->
      <!–[if lt IE 6]> IE6以下版本可識別 < ![endif]-->
      <!–[if gte IE 6]> IE6以及IE6以上版本可識別 < ![endif]-->
      <!–[if IE 7]> 僅IE7可識別 < ![endif]-->
      <!–[if lt IE 7]> IE7以下版本可識別 < ![endif]-->
      <!–[if gte IE 7]> IE7以及IE7以上版本可識別 < ![endif]-->

  • 手機上網留個言

  • 囧…我完全看不懂,就算 Leeiio 同學說明了,我還是不懂…淚奔 😥

  • 果然很短,對我這種每次都被代碼弄得頭暈暈的人來說,真的是輕鬆了許多。

  • 一般在HTML里都用那個if lte IE…JavaScript就不了解了

  • Pingback: 最短的 IE 判定 ­ Xu Design()

  • 一般都會把IE的判斷放到底層的腳本庫里 不會在用的時候每次都要寫這個判斷了

  • 是夠短啊,呵呵.

  • AnQ

    語句的確很簡練,我使用火狐時候多些,偶爾打開ie8。

  • 兄弟們上啊,把IE幹掉 ~ 😳

  • Pingback: Tweets that mention 全世界最短的 JavaScript 判定 IE 瀏覽器!這個可以短! - Leeiio Chaos Made. -- Topsy.com()

  • 這個相當好,可以擴展一下

  • 很好的技術文,支持!
    不過用了jquery框架,也很少關注跨瀏覽器的事了,主要還是在CSS上

  • IE還是給干不掉,汗!

  • ooaaooxx

    在做web前台開發的時候,多希望所有的人,都用firefox.

  • 這個真的很強…

  • 雖然用不到 但對JS不怎麼喜歡
    ❗ ❗

  • 這個不錯哦,測試下先

  • IE好個性哦 💡

  • 你真的很強大,可惜我不怎麼會JS。。。。

  • Pingback: 從數組BUG 判斷IE瀏覽器 – im Png()

  • 絕對不誤殺漏殺IE的方法…是用vbscript破壞頁面結構…

  • Pingback: CrBoy - 瘋狂世界 » 用JavaScript判定瀏覽器是否為IE()

  • 😕 今天要用到,所以通過GG我又滾回來了>_<

  • ie9 pp裡面已經失效了呢……

  • 很深刻的剖析了ie和其他瀏覽器處理[1,]的差異, :mrgreen:

  • Hox

    雖然IE⑨失效了,但是IE⑨已經比較標準了,基本FF能兼容的,IE⑨都能兼容了吧。能識別出IE⑨以下的,一般也就達到目的了····多謝分享,受教了···

  • I like what you guys are up too. Such smart work and reporting! Keep up the excellent works guys I have incorporated you guys to my blogroll. I think it’ll improve the value of my site :).