在实现RichFaces工具提示组件时遇到了一个特别奇怪的问题。在我的项目中,我有一个表格,显示用户输入的字符串列表,当用户将鼠标悬停在列表中的字符串上时,我希望弹出一些附加信息。
其中一个要求是,当用户输入时,任何多于一个单词的字符串必须包含双引号""
- 例如。单个单词将输入Java
与短语"Java is cool"
。
所以,我添加了一个<rich:toolTip>
来呈现其他信息(如果它存在 - 并且可以正常工作,除了包含双引号的字符串。例如(如表中所示)"sample string"
将不会显示有关鼠标悬停的其他信息。
我的JSF代码很简单:
<h:outputText id="keywordText" value="#{keywordData.keyword}"/>
<rich:toolTip for="keywordText" rendered="#{keywordData.comments != null}" value="#{keywordData.comments}"/>
就像我说的,这适用于不包含引号的单词/字符串。我想知道在JSF / RichFaces中是否有一个解决方法,我可以使用它来使用包含引号的字符串正常工作。或者也许在编写一个自定义JavaScript函数时会有一些帮助,强制或“欺骗”RichFaces正确处理字符串中的引号?
提前感谢您的帮助!
编辑我正在使用RichFaces 3.3.3
在页面源代码中,对于字符串"Testing Quotes"
(不起作用),我发现了这个:
<span id="j_id138:j_id144:keywordTable:"Testing Quotes":keywordText">"Testing Quotes"</span>
<span id="j_id138:j_id144:keywordTable:"Testing Quotes":j_id159" class="rich-tool-tip " style="z-index:99; ">
<span id="j_id138:j_id144:keywordTable:"Testing Quotes":j_id159content">
<p>This comment should display</p>
</span>
<span id="j_id138:j_id144:keywordTable:"Testing Quotes":j_id159script" style="display:none">
<script id="scriptj_id138:j_id144:keywordTable:" quotes":j_id159"="" testing="" type="text/javascript">
new ToolTip("j_id138:j_id144:keywordTable:"Testing Quotes":j_id159","j_id138:j_id144:keywordTable:"Testing Quotes":keywordText",{'showEvent':'mouseover'} );
</script>
</span>
您可以看到字符串本身中的引文(看起来应该是id属性的一部分)在new ToolTip
参数中被误解释。对于没有引号的字符串testkeywordawesome
,您可以看到它有效(因为它不包含引号):
<span id="j_id138:j_id144:keywordTable:testkeywordawesome:keywordText">testkeywordawesome</span>
<span id="j_id138:j_id144:keywordTable:testkeywordawesome:j_id159" class="rich-tool-tip " style="z-index: 99; visibility: hidden; display: none; left: 63.7833px; top: 210.75px;">
<span id="j_id138:j_id144:keywordTable:testkeywordawesome:j_id159content">
<p>the best comment in the world</p>
</span>
<span id="j_id138:j_id144:keywordTable:testkeywordawesome:j_id159script" style="display:none">
<script id="scriptj_id138:j_id144:keywordTable:testkeywordawesome:j_id159" type="text/javascript">
new ToolTip("j_id138:j_id144:keywordTable:testkeywordawesome:j_id159","j_id138:j_id144:keywordTable:testkeywordawesome:keywordText",{'showEvent':'mouseover'} );
</script>
</span>
Edit2 rich:column
中存在工具提示,其中存在rich:extendedDataTable
。以下是他们的代码:
<rich:extendedDataTable value="#{keywordEntry.globalKeywordsDataModel}"
rendered="#{fn:length(keywordEntry.globalKeywords) gt 0}"
styleClass="removeEDTSortIcon removeEDTContextMenu"
id="keywordTable" rowClasses="row1, row2"
var="keywordData" rows="0" noDataLabel=" "
headerClass="#{displayHeader == null or displayHeader ? 'rich-table-header' : 'hide'}"
rowKeyVar="keywordRowIdx" enableContextMenu="false"
sortMode="#{globalKeywordListSort.multiSortEnabled ? 'multi' : 'single'}"
sortPriority="#{globalKeywordListSort.sortOrderList}"
width="#{eStaffUser.userKeywordAdmin ? '750px' : '750px'}"
height="#{((fn:length(keywordEntry.globalKeywords)*30 + 50) lt 480) ? (fn:length(keywordEntry.globalKeywords)*30 + 50) : 480}px"
>
和
<rich:column id="#{globalKeywordSortFieldEnumBean.KEYWORD}" selfSorted="false" width="#{eStaffUser.userKeywordAdmin ? '48%' : '52%'}" sortBy="#{keywordData.keyword}"
sortOrder="#{globalKeywordListSort.dataTableColumnSortClass[globalKeywordSortFieldEnumBean.KEYWORD].sortOrder}">
答案 0 :(得分:0)
id="j_id138:j_id144:keywordTable:"Testing Quotes":keywordText"
这意味着<h:outputText id="keywordText">
的父母之一的ID由评估为"Testing Quotes"
的内容定义,这显然很糟糕。
答案 1 :(得分:0)
好的,问题的根源是rich:extendedDataTable
使用每个条目提供的ID为每个表行生成唯一ID。因此,问题最终出现在实现通用数据实体接口的底层&#34; Model Managed-Bean&#34; 中,此接口定义了getEntityId()
方法,在这种情况下, &#34; ID&#34;返回的是关键字值本身,因为没有真正的(即数据库)实体ID,例如主键:
public class KeywordDataBean implements SummaryDataEntityIF<String>
通过将接口的实现更改为Integer
并将散列作为每个关键字对象的唯一ID返回来解决问题:
public class KeywordDataBean implements SummaryDataEntityIF<Integer>
这会强制id
生成的html rich:extendedDataTable
是一个简单的整数而不是包含引号的(关键字)字符串,从而允许rich:toolTip
正常工作。