场景如下:
有一个数据表,有很多行,每行都包含一个输入文本,表外有一个小键盘,当用户单击小键盘上的按钮时,所选行中的输入文本将被更新,我希望它是聚焦的,这样用户也可以使用键盘输入更多的文本。
我使用p:commandButton作为键盘按钮,并使用ajax提交来设置bean中的selectedItem,并更新数据表以更改输入文本,但在那之后,焦点要么丢失,要么放在页面的第一个输入文本上。
我使用的是primeface 3.4。代码是这样的:
<p:dataTable id="datatable1" var="item" value="#{bean.itemlist}" rowKey="#{item.id}" rowIndexVar="rowIndex"
widgetVar="datatableVar" selection="#{bean.selectedItem}" selectionMode="single">
<p:column>
<p:inputText id="name" value="#{bean.selectedItem.name}"
onfocus="datatableVar.unselectAllRows();datatableVar.selectRow(#{rowIndex})" >
</p:column>
...
</p:dataTable>
<p:commandButton value="1" update="datatable1" id="bt1"
actionListener="#{bean.appendItem('1')}" />
我想我可以使用p:commandButton的oncomplete事件来设置输入文本焦点,但在p:dataTable中似乎没有客户端API来获取所选行。
我最终使用jQuery选择器来选择inputText。在渲染的html代码中,所选行(tr)具有属性"aria-selected='true'
"。
JS代码为:
var ele=$($("[aria-selected='true']").find('input').get(0));
ele
是一个jQuery组件,我可以使用它进行操作,如ele.focus()
或ele.keyup()