2014-11-23 80 views
10

我知道堆棧溢出有關於使用JavaScript檢測瀏覽器的一千個問題。我的問題是如何檢測瀏覽器沒有window.navigator(其中包括navigator.userAgent)?如何在不使用window.navigator的情況下可靠地檢測瀏覽器?

首先,爲了澄清,我不需要知道渲染引擎,這不適用於自適應佈局,也不要恐慌:我已經在做功能檢測。如果爲什麼我在問關於檢測瀏覽器是否重要,請評論,我會很樂意在解釋中進行拼接,但這可能會讓問題變得異常漫長。

接下來,讓我說明爲什麼我的問題是不是重複:

  • Browser detection in Javascript?因爲解答,的他們使用navigator.userAgent明確(包括jQuery.browser其使用的userAgent,並且現在已經消失了),使用navigator.appName(它在Chrome中給出了「Netscape」...), side-steps rec的問題優先特徵檢測,這與瀏覽器檢測不同(我已經使用特徵檢測,但要知道我可以使用它們的程度,我需要瀏覽器檢測),並且它們不是真正的答案,或者是特定於IE的特徵。 (雖然this non-answer實際上非常明顯,爲什麼我的問題在這裏是相關的:我試圖避免在某些瀏覽器上遇到痛點,會導致選項卡崩潰!)因爲我的問題是要求一個答案(即使是黑客?),而不使用window.navigator,它不是這個問題的重複。

  • Check if the user is using IE因爲 11的答案,10使用navigator.userAgent和他們的1使用的IE伎倆,只能檢測到IE瀏覽器,這是不夠的回答我的問題(儘管它可能是潛在的是一個有用的一小部分解決方案發布在此)?

  • In Javascript, how do I determine if my current browser is Firefox on a computer vs everything else?因爲 11的回答,8使用navigator.userAgent,2,推薦特徵檢測(再一次,不是我的問題),而1甚至不是一個答案,真的。

  • How to detect chrome and safari browser (webkit)因爲8的答案,其中6使用navigator.userAgent,和圖2是webkit的特異性。不幸的是,WebKit不一定僅限於Safari,我需要了解瀏覽器,而不是渲染引擎。

希望這是清澈的。

我知道還有其他方法可以做到這一點,但我不太清楚每個瀏覽器的細節。在某些瀏覽器中是否存在一致或可靠地暴露於JavaScript的對象或變量,也許?我知道一些實驗性的API是以供應商爲前綴的,但這似乎不是一個用於商業產品的好主意,儘管如果需要的話我願意屈服於此。任何其他可能性?

+5

這是一百萬其他更具體的問題,如http://stackoverflow.com/questions/12625876/how-to-detect-chrome-and-safari-browser-webkit和http:// stackoverflow。如果我的當前瀏覽器是Firefox上的計算機和http://stackoverflow.com/questions/19999388/jquery-檢查,如果用戶正在使用,即和http://stackoverflow.com/questions/2400935/browser-detection-in-javascript – meagar 2014-11-23 00:12:38

+0

@meager所有這些解決方案檢查用戶代理字符串或做功能檢測。這兩個都不是我的問題的選項。 – Matt 2014-11-23 00:13:47

+3

@meager你甚至讀過我的問題嗎?除了用戶代理之外,瀏覽器類型下注可以檢測到什麼?請重新打開問題。 – Matt 2014-11-23 00:15:17

回答

5

一個想法:

  • IE使用ActiveX(仍然沒有達到IE11,遺留),你可以很容易推斷出用戶從看的ActiveX可用性使用IE瀏覽器的事實,但是如果安全設置你需要重新開始,猜測是什麼,其他特徵檢測。
  • Chrome和Firefox都支持使用擴展名,也許檢測到這些擴展名會有所幫助
  • Chrome在全局範圍內提供了window['chrome']['webstore']對象。
  • 您可以通過與Object.keys窗口對象進行排序,並尋找供應商特定的名稱,如「MOZ」「毫秒」「O」

如果你結合了moz,ms和chrome對象,你可以嗅出三個最大的瀏覽器。

在附註中,功能檢測仍然是最佳選擇,不是針對OP,而是針對「我正在進入編程和我喜歡的知識 - 我嗅探出一個瀏覽器程序員「那裏。

+0

是的!這些是我正在尋找的黑客!謝謝。我會試驗這些想法。 – Matt 2014-12-16 16:22:44

5

首先,爲了清楚起見,沒有入站HTTP請求保證準確地說出他們是誰。實際上,這就是一些黑客通過僞裝HTTP頭的User-Agent字段來操作的方式。大多數瀏覽器提供但是,通過在入站HTTP請求標頭的User-agent字段中說明這一點,可以很好地確定他們的身份。在Javascript層面工作的唯一問題是它看起來頭部太高。但是也有技巧,這裏是其中的一個:

var req = new XMLHttpRequest(); 
req.open('GET', document.location, false); 
req.send(null); 
var headers = req.getAllResponseHeaders().toLowerCase(); 
alert(headers); 

,我發現這個思考的問題了一下,知道網絡側很好後...你可以閱讀更多關於此這裏:Accessing the web page's HTTP Headers in JavaScript,其實這問題可以被認爲是該答案的重複,但是,並不是每個人都知道HTTP層。上面的代碼假裝是一個合法的入站請求,並使用「Get」打開document.location,但它什麼也不發送。在不知道瀏覽器內部結構的情況下,我猜測它是返回已知頭信息的DOM本身。只需解析他的回覆中的用戶代理部分,就可以完成設置。

+2

你說得對,用戶代理不是檢測瀏覽器的可靠方法;這是我想避免它的一個原因。 (請參閱http://msdn.microsoft.com/en-us/library/ie/hh869301(v=vs.85).aspx)雖然支持一個非常聰明的解決方案 - 我從來沒有想到這一點! – Matt 2014-12-16 16:19:03

+0

感謝您發佈我看過「邊緣」的鏈接,但不知道它是什麼(直到現在)。祝你好運,尋找解決方案。 – 2014-12-16 16:35:22

相關問題