2009-08-18 151 views
42

我打算扮演一個魔鬼的擁護者。我一直在想,爲什麼瀏覽器檢測(而不是特徵檢測)被認爲是一種糟糕的做法。如果我測試某個特定版本的瀏覽器並確認,某些功能的行爲是以某種可預測的方式進行的,那麼決定做特殊情況似乎可以。理由是它將在未來萬無一失,因爲這部分瀏覽器版本不會改變。在另一方面,如果我發現一個DOM元素具有的功能X,它並不一定意味着:瀏覽器檢測與功能檢測

  1. 此功能適用於所有的瀏覽器同樣的方式,並
  2. 更爲關鍵的是,它會工作即使在所有未來的瀏覽器中也是如此。

我只是窺探了jQuery源代碼,他們通過將精心構造的HTML代碼片段插入到DOM中進行特徵檢測,然後檢查它是否具有某些功能。這是一個明智而穩固的方式,但是我想說如果我在我的一小段個人JavaScript(沒有jQuery)中做了這樣的事情,那將會有點沉重。他們還具有實際無限的質量保證資源的優勢。另一方面,你經常看到人們做的事情是他們檢查函數X的存在,然後基於此,他們認爲函數將在具有此函數的所有瀏覽器中以某種方式表現。

我不是說在這個意義上任何特徵檢測是不是一件好事(如果正確使用),但我不知道爲什麼瀏覽器檢測通常會立即辭退,即使它聽起來合乎邏輯。我想知道這是否是另一種流行的說法。

回答

26

在我看來,自從幾年前Resig發佈this post以來,瀏覽器檢測已被廣泛地忽視。然而,Resig的評論是特定於庫/框架代碼的,即代碼被其他[域特定]應用程序/站點消耗

我認爲功能檢測毫無疑問是適合庫/框架的。但對於域特定的應用程序,我並不確定瀏覽器檢測是否有問題。它適用於處理難以識別的已知瀏覽器特性,或者在實現特性本身時存在缺陷的瀏覽器。瀏覽器檢測合適的時間:

  • 非跨瀏覽器且需要顯示警告/對話框/ DifferentPage剪裁到該客戶端瀏覽器的站點/應用程序。這在傳統應用程序中很常見。
  • 銀行或有關支持哪些瀏覽器和版本(以避免可能危及用戶的數據已知的安全漏洞)
  • 微優化嚴格的政策,民營網站:偶爾一個瀏覽器是可笑的比別人快執行某些操作的時候某種方式。取決於您的用戶羣在特定的瀏覽器/版本上進行分支可能是有利的。
  • 在IE6中缺少png透明度
  • 許多顯示/渲染問題(閱讀:IE css支持)僅在特定瀏覽器版本中見過,而您實際上並不知道要測試哪些功能。

這就是說,有一些major pitfalls(可能是我們大多數人的承諾),以避免做瀏覽器檢測時。

+0

「*在我看來,自從幾年前Resig發佈此帖以來,瀏覽器檢測已被廣泛地忽視*」。瀏覽器檢測早在那篇文章之前就已經不是很好的做法我不認爲你使用瀏覽器檢測堆疊的任何原因。在哪個Intranet應用程序中缺乏對PNG透明度的支持?現在比以往任何時候都更簡單地編寫跨瀏覽器網站,只要採用實用的方法來實現更新的功能即可。你真的會放棄對瀏覽器的支持,因爲它不支持* const *或* let *? – RobG 2017-01-31 00:00:17

+0

@RobG:我從來沒有說過,「瀏覽器檢測」等於「拒絕訪問」和「放棄支持」。通過瀏覽器檢測,我只是指在代碼中存在「if(navigator.userAgent ...)」。如果檢測到某個瀏覽器會發生什麼變化。它可能僅僅意味着使用gif而不是png。 – 2017-01-31 16:23:09

5

理想的解決方案是具有兩個特徵和瀏覽器檢測的組合。前者因爲你提到的點和後者而下降,因爲有時候瀏覽器發佈虛假信息以「讓事情變得有效」。

Mozilla有一個偉大的Browser Detection Primer,可能會對你有所幫助爲好。

wikipedia 「在其歷史上的各個點,利用網絡的一直由一個瀏覽器,很多網站都設計成只與特定的瀏覽器上運行,而不是根據來自機構,如標準的程度W3C和IETF,這些網站通常包含「瀏覽器嗅探」代碼,這些代碼根據收到的用戶代理字符串改變發送的信息,這可能意味着不太流行的瀏覽器不會發送複雜的內容,即使它們能夠正確處理它,或者在極端情況下拒絕所有內容,因此各種瀏覽器會「欺騙」或「欺騙」這個字符串,以便將自己標識爲此類檢測代碼的其他內容;通常,瀏覽器的真實身份隨後會被包含串「。

23

Here's a good article解釋功能檢測是如何在這麼多的方式瀏覽器嗅探優越。

事實是,嗅探是非常脆弱的。理論上它很脆弱,因爲它依賴於任意任意userAgent字符串,然後將字符串實際映射到特定行爲。隨着時間的推移,它在實踐中也很脆弱。測試幾十種瀏覽器的每個主要版本和次要版本,並嘗試解析其中一些版本的內部版本號是不現實的;另一方面,測試怪癖的某些行爲更加健壯。例如,功能測試通常可以發現瀏覽器供應商偶然拷貝的錯誤和不一致之處。

從我自己的經驗,固定原型。js在IE8中,我知道如果我們一開始沒有嗅到,就可以避免90%的問題。

在修復Prototype.js時,我發現需要測試的一些功能在JS庫中非常普遍,所以我爲任何願意擺脫嗅探的人做了一些小小的集合common feature tests