2013-02-04 103 views
14

阻止IE絕對不是最佳做法,但這是我對現有應用程序的要求。從IE 10中的conditional comments aren't available開始,最有效的方法是什麼?對於IE 9和下面這將工作:阻止現代IE瀏覽器?

<!--[if IE]> 
<script type="text/javascript"> 
window.location = "/IEblocked.html"; 
</script> 
<![endif]--> 

假設有JavaScript解決方案,什麼陷阱我可能會找到一個最佳做法?我不知道是否有可能是問題圍繞以下內容:事件

  • 訂購射擊
  • iframe元素是我無法控制的其他<script>標籤
  • 的背景下,JS解決方案的
  • 優先
  • 通過document.write('<script type="text/javascript" src="foo.js"></script>');方法加載的腳本。

我有一種感覺很多人可能會被迫喊出「使用Modernizr的」「你瘋了,不要把腳本的DOM這樣!」,不幸的是這個應用程序很大,並且一些增強功能在這個範圍之外。

+7

爲什麼地球上,你會需要阻止IE10的檢測? – Pointy

+9

當你的客戶這麼說。 – blong

+2

http://www.quirksmode.org/js/detect.html – nbrooks

回答

15

那麼,IE是唯一支持客戶端VBScript的瀏覽器。

所以才添加到您的網頁:(除IEblocked.html本身當然)

<script type="text/vbscript"> 
Document.Location = "IEblocked.html" 
</script> 

我知道它的工作在IE9和下面的事實。 This comment幾乎證明它仍然在IE10工作得很好,併爲未來的我碰到這個博客帖子走過來埃裏克利珀:Rumours of VBScript's Death Have Been Greatly Exaggerated其中包含以下段落:

我們將繼續支持VBScript和JScript的可預見的未來。很顯然,VBScript,JScript,WSH等必須繼續隨操作系統一起交付,因爲大量現有的業務關鍵代碼依賴於它們。將其描述爲「死於緩慢的死亡」是過於戲劇化的。我們期望多年來,非託管COM腳本語言將繼續有用。在Visual Studio可持續工程團隊目前負責的VBScript,JScript中,Windows腳本組件,Windows腳本宿主等

雖然在8年前發佈的,我強烈相信的時候,我們仍然有漫長的歲月VBScript中存在的Windows的核心,未來版本的Internet Explorer將繼續使用它。

總結一下,我直接聯繫了Eric,並問「在Internet Explorer版本中,VBScript將作爲客戶端語言支持多久?」。作爲迴應,他說:

仍然有許多公司客戶在瀏覽器中依賴VBScript,因此MSFT將愚蠢地放棄對它的支持。支持起來非常便宜,即使是少數客戶的良好意願也很昂貴。

他不再在微軟工作,所以他的答案不是官方的,但它是最接近我可以得到的,而不是幾年的博客文章,但直接從源頭。所有事情都考慮到了,我可以得出結論,使用上述代碼將在未來的許多年內發揮作用。 :)

+1

現在這是個好主意!從來沒有想過使用VBScript專門針對爆炸物......另一個工具箱的工具! –

+7

這是美味的邪惡。 +1。 – vcsjones

+1

剛剛檢查IE10,它確實識別VBScript –

4

你的客戶是堅果。但如果他們付錢去做這件事,那麼......呃,不管。

如果您使用jQuery,它提供了瀏覽器檢測功能。它已經過時,所以你可能要避免使用最新版本,但它的工作:

if ($.browser.msie) { ....do crazy stuff here.... } 

如果你不使用jQuery,或者如果你不喜歡使用已過時的功能,你可以做到這一點:

  • 解析用戶代理字符串:

    if(!!navigator.userAgent.match(/MSIE/)) { .... do crazy stuff .... } 
    
  • 使用JavaScript有條件的意見(我相信仍然支持):

    if(Function('/*@cc_on return document.documentMode > [email protected]*/')()){ .... do crazy stuff .... } 
    

希望有幫助。

+1

這就是所謂的條件編譯。 –

+0

'.match(/ MSIE /)'是愚蠢的天真。 – Raynos

0

這裏將來參考是所有即在javascript

<script type="text/javascript"> 

// if I am opera I need to not enter this function 
if (!!(window.opera && window.opera.version)) { 
    // ok now am I IE (opera is the only other browser that will do this 
    if (document.all) { 
     // Now lets look at the versions, use the ones you want 

     // ie 5 
     if (!(document.compatMode != undefined)) { 
      // do ie 5 thing 
     } 
     else if ((document.compatMode != undefined) && (window.XMLHttpRequest == undefined)) { 
      // do ie 6 thing 
     } 
     else if ((document.XMLHttpRequest != undefined) && (document.querySelector == undefined)) { 
      // do ie 7 thing 
     } 
     else if ((document.querySelector != undefined) && (document.addEventListener == undefined)) { 
      // do ie 8 thing 
     } 
     else if ((document.addEventListener != undefined) && (window.atob == undefined)) { 
      // do ie 9 thing 
     } 
     else if (window.atob) { 
      // do ie 10+ thing 
     } 
     else { 
      // do ie 4 thing 
     } 
    } 
} 

+1

lolwut。 'if(document.all){/ *然後IE * /}'傻。 – Raynos

+1

**證明它錯了**。 Opera和IE只有兩個使用document.all的主要瀏覽器。雖然我不會寬恕使用JavaScript代碼,但有時需要爲CSS使用創建清晰的類擴展。事情是不可檢測的,如IE中的邊界半徑漸變背景......其中7,8和9中的一種方式,但如果你沒有檢測到9,那麼它將讀取8的方法並foobar你。但是,嘿,我給出了比你更多的答案。 –