2011-10-11 54 views
2

我有一個Web應用程序,其中包含某些在瀏覽器爲Internet Explorer時不應呈現的組件。如何根據瀏覽器類型渲染組件?

我可以在技術上使用jquery,但我認爲這並不好,因爲它是客戶端代碼,並在服務器上計算呈現的屬性。

我怎樣才能做到這一點?

回答

7

您可以檢查User-Agent標頭是否包含字符串MSIE。以下是所有「有效」MSIE標題字符串的概述:http://www.useragentstring.com/pages/Internet%20Explorer/您會看到所有MSIE字符串共享相同的模式"; MSIE "。你可以檢查是:

<h:someComponent rendered="#{!header['User-Agent'].contains('; MSIE ')}"> 

,或者當您不在的Servlet 3.0/EL 2.2尚未:

<h:someComponent rendered="#{!fn:contains(header['User-Agent'], '; MSIE ')}"> 

但是,您需要知道這是一個客戶端控制值,並可以很容易地被改變/欺騙。使用例如條件註釋在客戶端執行檢查更加可靠,因爲MSIE實際上只是用於解釋它們的瀏覽器。

2

如果你能避免它,我會建議不要爲特定的瀏覽器做特定的東西。特別是在服務器端,確定瀏覽器的唯一方法是user-agent字符串,但這是不可靠的 - 有些用戶可能會欺騙它,其他人可能會使用隱私軟件或代理將其完全空白。所以你真的不能確定服務器端的瀏覽器。

將相同的代碼提供給所有瀏覽器,然後在瀏覽器本身上執行功能檢測以確定哪些瀏覽器功能可用,這是好得多的想法。

一個很好的功能檢測腳本是Modernizr。您可以根據瀏覽器的功能使用此功能來定製您的網站。

對於IE版本8及更低版本的情況,在Modernizr不足的情況下,您只需爲瀏覽器做一些不同的事情來解決它的錯誤。在這種情況下,我建議在您的HTML代碼中使用Conditional Comments來插入特定於IE的代碼。條件註釋是一項僅由IE支持的功能,並且允許您定位特定版本,因此它非常適用於修復IE特定問題的解決方案。

+0

謝謝您。事情的真相是,我使用Openlayers,它不會在IE6-8中爲我工作,我沒有找到原因。我真的不知道具體可以檢測哪些功能來避免這個問題。 – Ben

0

您可以保存這樣的參數:

<ui:param name="isIE8" value="#{!header['User-Agent'].matches('.*; MSIE [2-8]\\.0.*')}"/> 

然後有條件地顯示一些代碼。

隨着JSF 1.2和香草HTML(沒有JSF組件),可以使用:

<f:verbatim rendered="#{isIE8}"> 
    Here is the code for old versions IE, without HTML5, for example 
</f:verbatim> 
<f:verbatim rendered="#{!isIE8}"> 
    Here is the code for other browsers 
</f:verbatim> 

使用JSF 2.0,2.2或含有JSF組件或EL,使用代碼:

<ui:fragment rendered="#{isIE8}"> 
    etc.