JSF + jQuery:如何实现StackOverFlow可折叠评论框

时间:2010-10-29 00:56:47

标签: jquery jsf primefaces

我正在创建一个Comment-Reply系统,类似于stackoverflow,我想知道如何使用JSF + jQuery实现它。我有一个dataTable,每行都有一个链接和一个textBox,一旦我点击一个链接,只显示同一行上的文本框,并将焦点放在该文本框上。

<h:form id="userComment">
    <p:dataTable value="bean.comments">
         <p:column>
              <!-- link that if u click on it, the textbox below appear -->
              <h:inputTextarea id="reply" />      
         </p:column>
    </p:dataTable>
</h:form>

我的主要障碍是,普通的jQuery用户会这样做:假设链接id foo 然后

$('#foo').click(function(){
    //Make the box with id `reply` appear and put focus on it
});

但由于每一行都有一个文本框调用reply,因此replyfoo之前会有prependId,例如userComment:1:foouserComment:1:reply。因此$('#foo')$('#reply')无效

1 个答案:

答案 0 :(得分:3)

以智能方式使用thisreplace

E.g。

<h:form>
    <p:dataTable value="#{bean.comments}" var="comment">
        <p:column>
            <h:outputText value="#{comment.text}" />
            <h:outputLink id="add" value="#" onclick="showReply(this)">Add reply</h:outputLink>
            <h:inputTextarea id="reply" value="#{comment.reply}" style="display:none;" />
        </p:column>
    </p:dataTable>
</h:form>

<script>
    function showReply(link) {
        jQuery(PrimeFaces.escapeClientId(link.id.replace(/add$/, 'reply'))).slideDown(function() {
            jQuery(this).focus();
        });
    }
</script>

string.replace(/add$/, 'reply')会将foo:1:add替换为foo:1:reply,而PrimeFaces提供的函数PrimeFaces.escapeClientId()会将其转义为有效的jQuery ID选择器。最后,您可以在回调中重点关注。