Internet explorer 如何根据浏览器类型渲染组件?

Internet explorer 如何根据浏览器类型渲染组件?,internet-explorer,jsf,jsf-2,Internet Explorer,Jsf,Jsf 2,我有一个web应用程序,其中包含某些组件,如果浏览器是Internet Explorer,则不应呈现这些组件 从技术上讲,我可以使用jquery,但我认为这不好,因为它是客户端代码,渲染属性是在服务器上计算的 如何执行此操作?您可以检查用户代理标题是否包含字符串MSIE。下面是所有“有效”MSIE头字符串的概述:您将看到所有MSIE字符串共享相同的模式“MSIE”。你可以检查一下: <h:someComponent rendered="#{!header['User-Agent'].con

我有一个web应用程序,其中包含某些组件,如果浏览器是Internet Explorer,则不应呈现这些组件

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


如何执行此操作?

您可以检查
用户代理
标题是否包含字符串
MSIE
。下面是所有“有效”MSIE头字符串的概述:您将看到所有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实际上是唯一解释它们的浏览器。

如果可以避免,我建议不要尝试为特定浏览器执行特定操作。特别是在服务器端,确定浏览器的唯一方法是
用户代理
字符串,但这是不可靠的-一些用户可能会欺骗它,其他人可能会使用隐私软件或完全屏蔽它的代理。因此,您确实无法确定服务器端的浏览器

更好的办法是为所有浏览器提供相同的代码,然后对浏览器本身进行功能检测,以确定哪些浏览器功能可用

需要一个好的特征检测脚本。您可以使用它根据浏览器的功能来定制您的站点


在IE版本8和更早版本的情况下,有一些情况下Modernizer是不够的,你只需要做一些不同的事情,这个浏览器就可以绕过它的bug。在这种情况下,我建议在HTML代码中使用插入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>

下面是旧版本IE的代码,例如,没有HTML5
以下是其他浏览器的代码
对于JSF 2.0、2.2或包含JSF组件或EL的代码,请使用:

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

谢谢。事情的真相是,我使用的是Openlayers,它在IE6-8中对我不起作用,我没有找到原因。我真的不知道具体可以检测到哪种功能来避免这个问题。