2011-10-11 33 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.