如何为Repeat中新插入项的输入控件设置焦点?
解决XForms Repeat新增条目后聚焦到新条目输入框的问题
针对你遇到的Repeat新增条目后无法聚焦到对应输入框的问题,这里提供两种可行的解决方案,避开动态ID的坑:
方案1:结合xf:setindex和context属性定位
先将Repeat的当前索引切换到新插入的条目,再通过context指定新条目的节点,让xf:setfocus定位到对应条目的输入框:
修改触发按钮的xf:action部分如下:
<xf:trigger> <xf:label>+</xf:label> <xf:action ev:event="DOMActivate"> <xf:insert origin="instance('data')/rows/row[last()]" ref="instance('data')/rows/row"/> <xf:setvalue ref="instance('data')/rows/row[last()]/fname"/> <xf:setvalue ref="instance('data')/rows/row[last()]/lname"/> <!-- 将Repeat索引设置为最后一个(新插入的条目) --> <xf:setindex repeat="r1" index="last()"/> <!-- 在新条目的上下文里聚焦fname输入框 --> <xf:setfocus control="fname" context="instance('data')/rows/row[last()]"/> </xf:action> </xf:trigger>
方案2:直接用repeat-index()函数关联上下文
如果插入操作后Repeat的索引已经自动更新到新条目(部分XForms实现会自动处理),也可以直接通过repeat-index()指定上下文:
<xf:setfocus control="fname" context="instance('data')/rows/row[repeat-index('r1')]"/>
不过为了兼容性,还是先执行xf:setindex确保索引正确更稳妥。
原理说明
Repeat内的控件ID是重复的,直接用control="fname"会默认匹配第一个条目。通过context属性指定新条目的节点,xf:setfocus会在该节点对应的Repeat行内查找ID为fname的控件,从而精准定位到新插入的条目输入框,同时避开了动态ID生成导致控件不显示的问题。
修改后的完整代码
<?xml-stylesheet href="xsltforms/xsltforms.xsl" type="text/xsl"?> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xf="http://www.w3.org/2002/xforms" xmlns:ev="http://www.w3.org/2001/xml-events" lang="en"> <head> <xf:model id="model"> <xf:instance id="data"> <data xmlns=""> <rows> <row> <fname>joe</fname> <lname>bloggs</lname> </row> </rows> </data> </xf:instance> </xf:model> </head> <body> <h1> Focus Test </h1> <xf:output value="index('r1')"/> <xf:repeat id="r1" ref="instance('data')/rows/row"> <xf:input id="fname" ref="fname"/> <xf:input ref="lname"/> </xf:repeat> <xf:trigger> <xf:label>+</xf:label> <xf:action ev:event="DOMActivate"> <xf:insert origin="instance('data')/rows/row[last()]" ref="instance('data')/rows/row"/> <xf:setvalue ref="instance('data')/rows/row[last()]/fname"/> <xf:setvalue ref="instance('data')/rows/row[last()]/lname"/> <xf:setindex repeat="r1" index="last()"/> <xf:setfocus control="fname" context="instance('data')/rows/row[last()]"/> </xf:action> </xf:trigger> </body> </html>
内容的提问来源于stack exchange,提问作者monojohnny
相关产品推荐
相关产品推荐

