我有一个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