【问题标题】:CSS conditionals for IE is not loaded when including <ui:composition template>包含 <ui:composition template> 时不加载 IE 的 CSS 条件
【发布时间】:2012-09-21 10:48:17
【问题描述】:

有 xhtml templ.xhtml 布局。

将其包含到其他 .xhtml 中,例如:

<ui:composition template="/template/templ.xhtml">

在 templ.xhtml 中定义条件,如:

<h:head>
 <h:outputText value="&lt;!--[if lt IE 8]&gt;&lt;h:outputStylesheet library=&quot;css&quot; name=&quot;styleie8.css&quot; /&gt;&lt;![endif]--&gt;" escape="false" />
</h:head>

styleie8.css 没有加载,但是当 Tomcat 运行时在templ.xhtml 中更改并保存了某些内容时,它加载正常。

如何让JSF在Tomcat启动时立即加载条件?

注意:
尝试使用以下替代方法:
1.

<!--[if lt IE 8]>
                <h:outputStylesheet name="styleie8.css" library="css"/>
<![endif]-->

2.

<o:conditionalComment if="lte IE 8">
            <link rel="stylesheet" href="styleie8.css" />
</o:conditionalComment>

3. #{request.contextPath}/resources 而不是简单的路径。
结果是一样的 - 我需要 resave .xhtml 模板来加载条件 css。

【问题讨论】:

  • 你能提供用你已经尝试过的东西生成的 HTML 吗?
  • &lt;!--[if lt IE 8]&gt; &lt;link rel="stylesheet" href="styleie8.css" /&gt;&lt;![endif]--&gt;
  • 请注意,必须下载 CSS 文件的是网络浏览器,而不是必须以某种方式“包含”CSS 文件的网络服务器(也不是 JSF)。请检查是否不仅仅是浏览器缓存造成了这种情况。
  • 我已经尝试过CTRL-RCTRL-F5。没有帮助。同样的问题出现在IE Tester 和纯IE 浏览器中。仅在模板xhtml 中进行了一些更改和重新保存后才会加载条件而Tomcat running。这是主要问题。
  • BalusC,也许我应该尝试复合组件

标签: css jsf load conditional


【解决方案1】:

您的初始代码 sn-p 错误。您不能在&lt;h:outputText escape="false"&gt; 中打印&lt;h:outputStylesheet&gt;&lt;h:outputStylesheet&gt; 是一个 JSF 组件,它应该生成 HTML,但在 &lt;h:outputText escape="false"&gt; 中它将按原样打印。如果您在浏览器中打开页面并右键单击,查看源代码,那么您应该自己发现了这一点。这个不对。网络浏览器只能理解 HTML,它应该是 &lt;link rel="stylesheet"&gt;

如果您已将样式表放在/resources/css/styleie8.css 中,那么以下应该可以工作:

<h:outputText value="&lt;!--[if lte IE 8]&gt;&lt;link rel=&quot;stylesheet&quot; href=&quot;#{request.contextPath}/resources/css/styleie8.css&quot; /&gt;&lt;![endif]--&gt;" escape="false" />

至于您尝试的替代方案,1) 将无法工作,因为它会被转义。 2) 假设 href 指向正确的 URL 应该可以工作。在您发布的示例中,它假定 CSS 文件与视图位于同一文件夹中。但是,如果它仍然位于/resources/css/styleie8.css,那么您应该使用过:

<o:conditionalComment if="lte IE 8">
    <link rel="stylesheet" href="#{request.contextPath}/resources/css/styleie8.css" />
</o:conditionalComment>

3) 应该可以工作,假设您提供了正确的 URL。

【讨论】:

  • 我又注意到一次:它工作正常,当 xhtml 重新保存时,例如Tomcat 以 &lt;o:conditionalComment if="lte IE 8"&gt; 开头,UI 已损坏。然后我在 xhtml 中更改了一些内容并重新保存,它工作正常。
  • 如果它在启动 Tomcat 时不起作用,但在您“触摸”文件服务器端时起作用,我对生成的 HTML 和浏览器的请求非常好奇。您能否发布这两个 HTML sn-ps 并在可能的情况下发布 Firebug(或 IE 替代品)的屏幕截图,显示浏览器尝试加载的内容?
【解决方案2】:

以下行将只输出您的字符串:

<h:outputText value="&lt;!--[if lt IE 8]&gt;&lt;h:outputStylesheet library=&quot;css&quot; name=&quot;styleie8.css&quot; /&gt;&lt;![endif]--&gt;" escape="false" />

h:outputStylesheet 也只是输出,作为组件处理。像这样h:outputStylesheet 用作组件:

<h:outputText value="&lt;!--[if lt IE 8]&gt;" escape="false" />
<h:outputStylesheet library="css" name="styleie8.css" />
<h:outputText value="&lt;![endif]--&gt;" escape="false" />

我认为你的第二个选择很接近。由于那里缺少上下文路径,您可能遇到了 404 错误。

【讨论】:

  • 对,&lt;h:outputText&gt; 应该打印&lt;link rel="stylesheet"&gt;,而不是&lt;h:outputStylesheet&gt;,但请注意,以这种方式使用&lt;h:outputStylesheet&gt; 是行不通的,因为它会被重新定位。他的问题毕竟令人困惑,因为备选方案 #2 应该完全有效。
  • 问题重现。我说过,这是由于使用了模板,只有在执行了一些更改后才会在运行时加载条件 css
  • BalusC,我尊重omnifaces minimumizm,但在我的情况下它确实有效)包含模板的一些问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-31
  • 2012-06-12
  • 1970-01-01
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多