我正在使用 OmniFacesFullAjaxExceptionHandler显示错误页面。错误页面显示正确,但我在这些页面的样式方面遇到问题。
我的应用程序使用的模板在 body 元素上定义了 CSS 类。这些类对于正常页面和错误页面是不同的:
正常页面:
<h:body styleClass="main-body layout-compact">
错误页面:
<h:body styleClass="exception-body error-page">
当FullAjaxExceptionHandler处理异常时,会转发到错误页面(基于<error-page>
机制在web.xml
)。显然这不会重新渲染<h:body>
标签,因为在检查 HTML 输出时,我可以看到<body>
标签仍然包含正常页面的 CSS 类(而不是错误页面的类)。
貌似是原来的内容<h:body>
替换为错误页面的内容<h:body>
而不是仅仅替换完整的<h:body>
。我不知道这是否是默认的 JSF / FullAjaxExceptionHandler 行为。
有什么办法可以拥有<h:body>
使用正确的 CSS 类渲染?将 CSS 类移离<h:body>
不是一个选择。
不幸的是,这是“设计使然”。 JSF 在执行 ajax 导航时不会替换整个文档,而只会替换单个文档的子级<head>
and <body>
元素,而父母却没有受到影响。这样做是出于历史原因;即旧版 Internet Explorer 不支持完全替换它们。
我自己所做的就是简单地将样式放入<main>
元素代替。这<header>
and <footer>
在最终的 HTML 输出中通常是相同的。基本上:
<html>
<head>
<title>...</title>
</head>
<body>
<header>...</header>
<main class="#{page.type}">...</main>
<footer>...</footer>
</body>
</html>
如果您确实需要拥有<body class>
修改后,那么最好的选择是通过错误页面模板中嵌入的 JavaScript 来完成此操作。
<h:outputScript rendered="#{faces.ajaxRequest}">
document.body.className = "exception-body error-page";
</h:outputScript>
Note: #{faces}
仅自 OmniFaces 2.5 起可用,如果您使用的是旧版本,请改用#{facesContext.partialViewContext.ajaxRequest}
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)