我有一個Web應用程序,其中包含某些在瀏覽器爲Internet Explorer時不應呈現的組件。如何根據瀏覽器類型渲染組件?
我可以在技術上使用jquery,但我認爲這並不好,因爲它是客戶端代碼,並在服務器上計算呈現的屬性。
我怎樣才能做到這一點?
我有一個Web應用程序,其中包含某些在瀏覽器爲Internet Explorer時不應呈現的組件。如何根據瀏覽器類型渲染組件?
我可以在技術上使用jquery,但我認爲這並不好,因爲它是客戶端代碼,並在服務器上計算呈現的屬性。
我怎樣才能做到這一點?
您可以檢查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實際上只是用於解釋它們的瀏覽器。
如果你能避免它,我會建議不要爲特定的瀏覽器做特定的東西。特別是在服務器端,確定瀏覽器的唯一方法是user-agent
字符串,但這是不可靠的 - 有些用戶可能會欺騙它,其他人可能會使用隱私軟件或代理將其完全空白。所以你真的不能確定服務器端的瀏覽器。
將相同的代碼提供給所有瀏覽器,然後在瀏覽器本身上執行功能檢測以確定哪些瀏覽器功能可用,這是好得多的想法。
一個很好的功能檢測腳本是Modernizr。您可以根據瀏覽器的功能使用此功能來定製您的網站。
對於IE版本8及更低版本的情況,在Modernizr不足的情況下,您只需爲瀏覽器做一些不同的事情來解決它的錯誤。在這種情況下,我建議在您的HTML代碼中使用Conditional Comments來插入特定於IE的代碼。條件註釋是一項僅由IE支持的功能,並且允許您定位特定版本,因此它非常適用於修復IE特定問題的解決方案。
您可以保存這樣的參數:
<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.
謝謝您。事情的真相是,我使用Openlayers,它不會在IE6-8中爲我工作,我沒有找到原因。我真的不知道具體可以檢測哪些功能來避免這個問題。 – Ben