rich:toolTip不处理包含引号的String值

时间:2015-01-28 15:25:01

标签: jsf richfaces

在实现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}">

2 个答案:

答案 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正常工作。