Seam2.2.1+JSF1.2+RichFaces3.3.3:DataTable行点击排除指定列方案咨询
解决DataTable删除图标不触发行点击事件的简便方案
嘿,这个问题其实很常见,核心就是阻止事件冒泡——因为点击删除图标时,事件会默认向上冒泡到父行,触发你设置的onRowClick。针对你的技术栈(Seam 2.2.1 + JSF 1.2 + RichFaces 3.3.3),有个超简便的实现方式:
直接在删除图标的点击事件里,添加阻止事件传播的JavaScript代码,这样点击删除按钮时,事件就不会传递到行元素上,自然不会触发行点击逻辑。
具体代码示例
<rich:panel headerClass="panelHeader" styleClass="panel"> <f:facet name="header">Header</f:facet> <rich:dataTable id="myTable" value="#{myModel}" var="k"> <!-- 行点击的支持组件 --> <a4j:support event="onRowClick" action="#{myBean.handleRowClick(k)}" reRender="targetArea" /> <!-- 其他列定义 --> <rich:column> <h:outputText value="#{k.someProperty}" /> </rich:column> <!-- 删除按钮列 --> <rich:column> <a4j:commandLink action="#{myBean.deleteItem(k)}" reRender="myTable" <!-- 关键:阻止事件冒泡 --> onclick="if (event.stopPropagation) { event.stopPropagation(); } else { event.cancelBubble = true; }"> <h:graphicImage value="/images/delete_icon.png" alt="删除" /> </a4j:commandLink> </rich:column> </rich:dataTable> </rich:panel>
代码说明
event.stopPropagation()是标准浏览器的事件阻止方法,event.cancelBubble = true是兼容旧版IE的写法(毕竟JSF 1.2时代IE还很流行),两者结合能覆盖所有主流浏览器。- 这段JS代码会在
<a4j:commandLink>的删除逻辑执行前,先拦截事件冒泡,确保行的onRowClick不会被触发。 - 不需要修改行点击的原有逻辑,只需要给删除按钮加这一行代码,非常轻量。
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

