优先级较低,因为存在一个乏味的解决方法,即在相关CC的客户端中不使用任何空格或换行符,但这会导致难以阅读的XHTML代码。
此外,这与How to remove white spaces in JSF output?
相关但不完全相同(不是重复项):众所周知,HTML中未剥离的换行符可能会导致较小的空格差。这可能会影响JSF复合组件,尤其是组合组件时。有一个使用注释的麻烦解决方法,因此不会出现换行符。例如,我将其用于FontAwesome图标的组件,这些组件需要并排且它们之间没有空格(在不使用浮点的情况下),例如此组件<util:helpIcon>
:
<cc:implementation><!--NOGAP
--><span id="#{cc.clientId}"><!--
--><ui:fragment
rendered="#{viewConfigurationManager.doShowHelpIcons}"
><!--
--><span class="fa-stack help-fa-stacked" title="#{cc.attrs.title}"><!--
--><i style="color:white;font-size:0.9em" class="fa fa-circle fa-stack-1x"/><!--
--><i style="color:blue;font-size:0.9em" class="fa fa-info-circle fa-stack-1x"/><!--
--></span><!--
--></ui:fragment><!--
--></span><!--
--></cc:implementation>
(请注意,必须在<cc:implementation>
和第一个<span>
之间使用它,否则,当您将其放置在相似的图标组件旁边时,可能会得到不需要的空间。)
但是,在使用<cc:insertChildren>
时,客户端XHTML中的任何换行符都会传播,并可能导致不必要的空格。例如,在使用<util:helpLabel>
并将CC标记插入<util:helpIcon>
的CC <label>
中:
<cc:implementation><!--NOGAP
--><span id="#{cc.clientId}"><!--
--><util:helpIcon
title="#{cc.attrs.title}"
/><!--
--><h:outputLabel
title="#{cc.attrs.title}"
for="#{cc.attrs.for}"
><!--NOGAP
--><cc:insertChildren/><!--
--></h:outputLabel><!--
--></span><!--
--></cc:implementation>
(实际的组件实际上还包含<h:outputLabel>
中的以下内容,也可以传递简单的value
,但这个问题与<cc:insertChildren/>
部分有关。
value="#{fn:trim(cc.attrs.value)}"
)
这是没有<!--NOGAP-->
技巧的相同组件:
<cc:implementation><span id="#{cc.clientId}"><util:helpIcon
title="#{cc.attrs.title}"
/><h:outputLabel
title="#{cc.attrs.title}"
for="#{cc.attrs.for}"
><cc:insertChildren/></h:outputLabel></span></cc:implementation>
如果在客户端XHTML中,我使用换行符的“ nice”格式调用以上内容,则在插入的子代和图标之间会得到多余的空格:
<util:helpLabel title="[help_text]">
Points<br/>targeted<br/><em>(sum)</em>
</util:helpLabel>
为避免不必要的空间,必须对客户端XHTML进行严格的格式化:
<util:helpLabel title="[help text]">Points<br/>targeted<br/><em>(user)</em></util:helpLabel>
这似乎不太大惊小怪,但是在许多情况下,我有一些非常复杂的标记作为子代插入,并且如果我在客户端XHTML中删除换行符,将变得很难阅读。我也有数百种这样的情况要处理,我大量使用了<util:helpLabel>
组件(实际上比这里显示的要多得多)。
我尝试使用空白servlet过滤器,例如John Yeary中的这种JSF友好过滤器(类似于much older one from BalusC,但使用HTML感知库):https://github.com/bluelotussoftware/whitespace-filter。它按设计工作,但不会阻止空白出现,因为在这种情况下,不需要的空白不在标签之间,而是在<label>
和某些文本之间:
<span class="fa-stack help-fa-stacked" title="[help]" style="font-size: 1.1em; padding-right: 0px;"><i style="color:white;font-size:0.9em" class="fa fa-circle fa-stack-1x"></i><i style="color:blue;font-size:0.9em" class="fa fa-info-circle fa-stack-1x"></i></span></span><label for="tableCredit:j_idt1722:" style="padding-left:0 !important; " title="[title]" class=" "> Points<br/>targeted<br/><em>(sum)</em></label>
请注意<label>
和单词Points
之间的空格,这是由于通过换行符而使插入的子代变为空格。 (您必须向右滚动该框,注意它故意没有换行符。)
“一个不同的天,一个天 空间造成了……之前有一个彩虹 一个烦人的空间我...“
问题1:是否可以修剪<cc:insertChildren/>
中的换行符或空格?
Q2:是否有任何Mojarra配置参数来避免整个问题,因为换行符成为JSF中的多余空间(似乎不是)?
如果没有,最好有一个。