rich:toolTip 不处理包含引号的字符串值

rich:toolTip not handling String values that contain quotes

在实施 RichFaces 工具提示组件时,我 运行 遇到了一个特别难 运行ge 的问题。在我的项目中,我有一个 table 显示用户输入的字符串列表,我希望当用户将鼠标悬停在列表中的字符串上时弹出附加信息。

其中一个要求是任何超过一个单词的字符串在用户输入时必须包含双引号""——例如单个单词将输入为 Java 而不是短语 "Java is cool"

因此,我添加了一个 <rich:toolTip> 来呈现附加信息(如果存在的话)--并且它有效,但包含双引号的字符串除外。例如(如 table 中显示的那样)"sample string" 不会在鼠标悬停时显示其他信息。

我的 JSF 代码很简单:

<h:outputText id="keywordText" value="#{keywordData.keyword}"/>
<rich:toolTip for="keywordText" rendered="#{keywordData.comments != null}" value="#{keywordData.comments}"/>

就像我说的,这适用于不包含引号的 words/strings。我想知道 JSF/RichFaces 中是否有我可以使用的解决方法,以便使它与包含引号的字符串一起正常工作。或者也许在编写自定义 JavaScript 函数以强制或 "tricks" 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}">
id="j_id138:j_id144:keywordTable:"Testing Quotes":keywordText"

这意味着 <h:outputText id="keywordText"> 的其中一个父代的 id 由计算结果为 "Testing Quotes" 的东西定义,这显然很糟糕。

好的,问题的根源在于 rich:extendedDataTable 使用每个条目提供的 ID 为每个 table 行生成唯一的 ID。所以问题最终出现在实现通用数据实体接口的底层 "Model Managed-Bean" 中,该接口定义了一个 getEntityId() 方法,在这种情况下, "ID" 返回的是关键字值本身,因为没有真正的(即数据库)实体 ID,例如主键:

public class KeywordDataBean implements SummaryDataEntityIF<String>

通过将接口的实现更改为 Integer 并将散列作为每个关键字对象的唯一 ID 返回,问题已解决:

public class KeywordDataBean implements SummaryDataEntityIF<Integer>

这迫使 rich:extendedDataTable 生成的 html id 是一个简单的整数而不是包含引号的(关键字)字符串,允许 rich:toolTip正常工作。