我正在创建一个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
,因此reply
和foo
之前会有prependId,例如userComment:1:foo
或userComment:1:reply
。因此$('#foo')
和$('#reply')
无效
答案 0 :(得分:3)
以智能方式使用this
和replace
。
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选择器。最后,您可以在回调中重点关注。