You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 06:03:15