如何根据浏览器类型呈现组件?

时间:2011-10-11 05:53:50

标签: internet-explorer jsf jsf-2

我有一个Web应用程序,如果浏览器是Internet Explorer,我有一些不应该呈现的组件。

我可以在技术上使用jquery,但我认为这不好,因为它是客户端代码,并且渲染的属性是在服务器上计算的。

我该怎么做?

3 个答案:

答案 0 :(得分:8)

您可以检查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实际上是解释它们的唯一浏览器。

答案 1 :(得分:2)

如果你可以避免它,我建议不要尝试为特定的浏览器做特定的事情。特别是在服务器端,确定浏览器的唯一方法是user-agent字符串,但这是不可靠的 - 有些用户可能会欺骗它,有些用户可能会使用隐私软件或完全空白的代理。所以你真的无法确定服务器端的浏览器。

最好将相同的代码提供给所有浏览器,然后在浏览器上进行功能检测,以确定可用的浏览器功能。

一个好的功能检测脚本是Modernizr。您可以使用此选项根据浏览器的功能自定义您的站点。

在IE 8及更早版本的情况下,有一些情况下Modernizr是不够的,你只需要为这个浏览器做一些不同的事情来解决它的错误。在这种情况下,我建议在HTML代码中使用Conditional Comments来插入特定于IE的代码。条件注释是一项仅受IE支持的功能,允许您定位特定版本,因此非常适合黑客攻击解决特定于IE的问题。

答案 2 :(得分:0)

您可以像这样保存参数:

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

然后有条件地显示一些代码。

使用JSF 1.2和vanilla 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.