jsf - OmniFaces 条件注释未写入 HTML 输出

标签 jsf omnifaces conditional-comments

我正在使用 OmniFaces conditionalComment 加载 IE 6 浏览器的 javascript 文件。在网站上,它说脚本应该包含在页面中,如下所示:

<script type="text/javascript" src="[JS library]"></script>
<!--[if (gte IE 6)&(lte IE 8)]>
  <script type="text/javascript" src="selectivizr.js"></script>
  <noscript><link rel="stylesheet" href="[fallback css]" /></noscript>
<![endif]-->

这不是有效的 xml,因此不能在 JSF xhtml 文件中使用。相反,我使用这个:

<h:body>
  <f:facet name="last">
    <o:conditionalComment if="if (gte IE 6)&amp;(lte IE 8)">
      <h:outputScript library="js" name="selectivizr-min.js" target="head"/>
    </o:conditionalComment>
  </f:facet>
...
</h:body>

我将脚本包含在 xhtml 的主体部分中,并将其放在 Facet name="last"中,因此它包含在 JQuery 之后(我使用 PirmeFaces 并阅读这是最安全的方法)。 target="head"确保将其写入生成的 html 文件的 head 部分。脚本的链接包含在文档的正确部分中(在 PrimeFaces 导入之后),但它没有被条件注释包围。

以下是 html 的相关部分(已重新格式化以便于阅读):

<head>
  <link type="text/css" rel="stylesheet" href="/javax.faces.resource/theme.css.xhtml?ln=primefaces-aristo" />
  <link type="text/css" rel="stylesheet" href="/javax.faces.resource/primefaces.css.xhtml?ln=primefaces&amp;v=5.1" />
  <script type="text/javascript" src="/javax.faces.resource/jquery/jquery.js.xhtml?ln=primefaces&amp;v=5.1"></script>
  <script type="text/javascript" src="/javax.faces.resource/primefaces.js.xhtml?ln=primefaces&amp;v=5.1"></script>
  <script type="text/javascript" src="/javax.faces.resource/jquery/jquery-plugins.js.xhtml?ln=primefaces&amp;v=5.1"></script>
  <script type="text/javascript" src="/javax.faces.resource/omnifaces.js.xhtml?ln=omnifaces"></script>
  <link type="text/css" rel="stylesheet" href="/javax.faces.resource/styles.css.xhtml?ln=css" />
  <script type="text/javascript" src="/javax.faces.resource/selectivizr-min.js.xhtml?ln=js"></script>

最后一行缺少注释 (!--[if (gte IE 6)&(lte IE 8)]> ...)。

我做错了什么?有什么建议吗?

干杯, 多米尼克

最佳答案

这个问题有两个方面:

  1. <f:facet name="last">在这种情况下没有任何意义。摆脱它。它将被忽略,包括它的任何子级。仅在<h:head>内有效(即使如此,只有当您使用 PrimeFaces 时;谁实际上忽略了 native JSF 将头资源排序为最后的可能性)。

  2. 您不能使用<h:outputScript> (也不是 <h:outputStylesheet> 内的 <o:conditionalComment> ,因为 JSF 会隐式地将其自动重定位到 <head> 。这也在 documentationshowcase 中暗示。

只需使用普通 Vanilla <script> (或<link rel="stylesheet">)。

<o:conditionalComment if="(gte IE 6)&amp;(lte IE 8)">
    <script src="#{resource['js/selectivizr-min.js']}" />
</o:conditionalComment>

请注意,我修复了无效的 if通过删除重复的 if 来获取属性值.


与具体问题无关:library="js"表示对 library 的误解属性。仔细阅读What is the JSF resource library for and how should it be used? #{resource}上述答案中的解析器已更改为使用 js作为常规文件夹而不是库。

关于jsf - OmniFaces 条件注释未写入 HTML 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26719135/

相关文章:

java - requestScope 中的以下属性在哪里? "requestScope.shouldRender"

jsp - 如何使用 JSP 创建复合组件?

jsf - org.omnifaces.cdi.push.SocketChannelManager$ViewScope 无法转换为 com.sun.faces.push.WebsocketChannelManager$ViewScope

jsf - 图形图像 : How to use a default image if value attribute would return null?

glassfish - 在 OmniFaces @Eager bean 中注入(inject) @EJB 会导致 "Severe: No valid EE environment for injection of org.omnifaces.cdi.eager.EagerBeansRepository"

html - Vue html 评论处理

java - 如何在 EL 中比较字符串变量?

jsf - 渲染 View 错误 : java. lang.IllegalStateException:提交响应后无法创建 session

html - 关于 HTML 条件注释

css - 如何从 IE10 及更高版本中排除样式表