提前致歉,我没有做很多前端开发。但是简而言之,xmlns属性是删除标记并将其在呈现的文档中移动。这可能是一个JSF问题,因为它甚至发生在视图源中。此svg标记有效且不会更改结构:
<svg id="Layer_1" x="0px" y="0px" width="150px" height="150px" viewBox="0 0 150 150" enable-background="new 0 0 150 150">
但是,一旦声明了xml名称空间,页面上的所有代码都会被更改。它移动我的span标签,一个标签,header标签,删除关闭的div标签,并以破坏所有内容的方式对其进行排序。这是原始xhtml的示例,并呈现了xhtml和html的xmlns
jsf之前的xhtml:
<a href="?service=all" class="#{servicesAllClass}">
<span>
<svg **xmlns="http://www.w3.org/2000/svg"** id="Layer_1" x="0px" y="0px"
width="150px" height="150px" viewBox="0 0 150 150" enable-background="new 0 0 150 150">
<path fill="#3A3838" d="M126.83,8.875H22.169c-7.116,0-12.884,5.768-12.884,12.884v102.482c0,7.115,5.768,12.884,16.884,12.884
H130.83c3.116,0,8.884-5.769,8.884-12.884V21.759C139.714,14.643,133.946,8.875,126.83,8.875z M38.643,118.505
c-5.93,0-10.737-4.807-10.737-10.737c0-5.93,4.807-10.736,10.737-10.736s10.736,4.807,10.736,10.736
C49.379,113.698,44.573,118.505,38.643,118.505z M38.643,83.736c-5.93,0-10.737-4.806-10.737-10.736
c0-5.93,4.807-10.737,10.737-10.737S49.379,67.07,49.379,73C49.379,78.931,44.573,83.736,38.643,83.736z M38.643,48.969
c-5.93,0-10.737-4.807-10.737-10.737s4.807-10.736,10.737-10.736s10.736,4.806,10.736,10.736S44.573,48.969,38.643,48.969z
M112.834,45.167H68.166c-4.418,0-8-3.582-8-8s3.582-8,8-8h44.668c4.418,0,8,3.582,8,8S117.252,45.167,112.834,45.167z
M112.834,80.167H68.166c-4.418,0-8-3.581-8-8c0-4.418,3.582-8,8-8h44.668c4.418,0,8,3.582,8,8
C120.834,76.586,117.252,80.167,112.834,80.167z M112.834,115.167H68.166c-4.418,0-8-3.581-8-8s3.582-8,8-8h44.668
c4.418,0,8,3.581,8,8S117.252,115.167,112.834,115.167z"></path>
</svg>
</span>
<h5>All</h5>
</a>
这是JSF之后的代码,当xmlns位于标记中时,请注意缺少闭合锚标记,该标记没有被遗漏,只是不存在。但是,当删除xmlns时,它的显示与原始(上面)脚本完全相同,因此我选择不包括它。
在任何浏览器中提取时的DOM(请注意缺少的锚标记,它像30行一样向下移动了
<a href="?service=all-services" class="disabled">
<span><svg xmlns="http://www.w3.org/2000/svg" id="Layer_1" x="0px" y="0px" width="150px" height="150px" viewBox="0 0 150 150" enable-background="new 0 0 150 150">
<path fill="#3A3838" d="M126.83,8.875H22.169c-7.116,0-12.884,5.768-12.884,12.884v102.482c0,7.115,5.768,12.884,16.884,12.884 H130.83c3.116,0,8.884-5.769,8.884-12.884V21.759C139.714,14.643,133.946,8.875,126.83,8.875z M38.643,118.505 c-5.93,0-10.737-4.807-10.737-10.737c0-5.93,4.807-10.736,10.737-10.736s10.736,4.807,10.736,10.736 C49.379,113.698,44.573,118.505,38.643,118.505z M38.643,83.736c-5.93,0-10.737-4.806-10.737-10.736 c0-5.93,4.807-10.737,10.737-10.737S49.379,67.07,49.379,73C49.379,78.931,44.573,83.736,38.643,83.736z M38.643,48.969 c-5.93,0-10.737-4.807-10.737-10.737s4.807-10.736,10.737-10.736s10.736,4.806,10.736,10.736S44.573,48.969,38.643,48.969z M112.834,45.167H68.166c-4.418,0-8-3.582-8-8s3.582-8,8-8h44.668c4.418,0,8,3.582,8,8S117.252,45.167,112.834,45.167z M112.834,80.167H68.166c-4.418,0-8-3.581-8-8c0-4.418,3.582-8,8-8h44.668c4.418,0,8,3.582,8,8 C120.834,76.586,117.252,80.167,112.834,80.167z M112.834,115.167H68.166c-4.418,0-8-3.581-8-8s3.582-8,8-8h44.668 c4.418,0,8,3.581,8,8S117.252,115.167,112.834,115.167z"></path>
</svg>
<h5>All</h5>
</span>
所需的完整文件:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:fn="http://java.sun.com/jsp/jstl/functions" xmlns:c="http://xmlns.jcp.org/jsp/jstl/core" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets">
<head></head>
<body>
<ui:composition>
<div style="display:grid;">
<a href="?service=all" class=".test">
<span>
<svg xmlns="http://www.w3.org/2000/svg" id="Layer_1" x="0px" y="0px"
width="150px" height="150px" viewBox="0 0 150 150" enable-background="new 0 0 150 150">
<path fill="#3A3838" d="M126.83,8.875H22.169c-7.116,0-12.884,5.768-12.884,12.884v102.482c0,7.115,5.768,12.884,16.884,12.884
H130.83c3.116,0,8.884-5.769,8.884-12.884V21.759C139.714,14.643,133.946,8.875,126.83,8.875z M38.643,118.505
c-5.93,0-10.737-4.807-10.737-10.737c0-5.93,4.807-10.736,10.737-10.736s10.736,4.807,10.736,10.736
C49.379,113.698,44.573,118.505,38.643,118.505z M38.643,83.736c-5.93,0-10.737-4.806-10.737-10.736
c0-5.93,4.807-10.737,10.737-10.737S49.379,67.07,49.379,73C49.379,78.931,44.573,83.736,38.643,83.736z M38.643,48.969
c-5.93,0-10.737-4.807-10.737-10.737s4.807-10.736,10.737-10.736s10.736,4.806,10.736,10.736S44.573,48.969,38.643,48.969z
M112.834,45.167H68.166c-4.418,0-8-3.582-8-8s3.582-8,8-8h44.668c4.418,0,8,3.582,8,8S117.252,45.167,112.834,45.167z
M112.834,80.167H68.166c-4.418,0-8-3.581-8-8c0-4.418,3.582-8,8-8h44.668c4.418,0,8,3.582,8,8
C120.834,76.586,117.252,80.167,112.834,80.167z M112.834,115.167H68.166c-4.418,0-8-3.581-8-8s3.582-8,8-8h44.668
c4.418,0,8,3.581,8,8S117.252,115.167,112.834,115.167z"></path>
</svg>
</span>
<h5>All</h5>
</a>
</div>
</ui:composition>
</body>
</html>
详细信息:
我明确的问题:“将XML名称空间属性添加到元素时,可能导致dom更改的原因是什么?”
应用程序服务器+ IDE:Glassfish 5.0-Java EE 8-JSF 2.3.2-SCSS css预处理程序仅处理.scss文件-intellij IDEA Ultimate(最新)
所有文件均为.xhtml,目前还没有托管Bean,代码或javascript以任何方式影响此效果。
如果将HTML放入没有JSF的tomcat中,则不会发生这种情况。这就是为什么我指的是JSF,但我可能不正确。
答案 0 :(得分:1)
我调试了一下,发现这一定是在JSF SAXCompiler例程中发生的。
尽管com.sun.faces.facelets.compiler.SAXCompiler.CompilationHandler
按照XHTML源代码以正确的顺序调用了自己的startElement
和endElement
方法,但是
FaceletHandler h = this.compiler.compile(url, alias);
com.sun.faces.facelets.impl.DefaultFaceletFactory
Mojarra 2.3.8的第475行是表示观察到的错误元素树结构的FaceletHandler
。
也有a very similar question,当时为reported as a bug to Mojarra。解决该错误后,我认为这是一个新错误。因此,我建议您使用缩小的可复制示例报告该错误。对于您的应用程序,您应该考虑使用BalusC建议的<ui:include src="/resources/svg/one.svg" />
来响应the other question来使用SVG。