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

动态添加SharePoint People picker控件仅最后一个可输入用户问题求助

问题根源
  • 代码中document.getElementById("msdetail").innerHTML += 新增内容的写法是核心问题:innerHTML += 操作会先把容器内所有已存在的DOM节点全部清空销毁,再把原有内容+新内容拼接后重新渲染,之前已经初始化完成的People Picker控件绑定的事件、生成的内部输入元素会被完全清除,只有最后一次新增后初始化的控件能保留完整结构正常使用。
  • 额外隐藏问题:新增行里的提示label用了固定id RecipientsInfo,重复id会导致DOM操作异常;原计数逻辑统计的是.form-group-5的长度,但新增行的类是.form-group-6,计数错误可能导致行id重复。
修复方案

把innerHTML +=替换为insertAdjacentHTML方法,该方法只会在指定位置插入新DOM节点,不会修改已存在的节点,原有控件的结构和事件都会被保留,同时修复计数和重复id问题。

修正后的代码示例
$("#add-new-msdetail").click( e => {
    // 修正计数:统计已存在的form-group-6行数量
    var cnt = $('.form-group-6').length;
    var id = cnt + 1;
    // 用insertAdjacentHTML插入新内容,不影响原有DOM
    document.getElementById("msdetail").insertAdjacentHTML('beforeend',
    `<br><br><hr/>
    <div class="form-group-6" id="TrackerDtl${id}">   
    <div class="form-item">
        <span>${id}</span>
        </div>                                                                                                                   
        <div class="form-item">                                                
            <label class="labelcl" for="shorttitle">Action(s)<span style="color: red;"> *</span></label>
            <textarea class="span6 form-control" rows="2" id="ctrlAction${id}" placeholder="Action name" required></textarea>   

        </div>
        <div class="form-item">                                              
            <label class="labelcl" for="Description">Milestone(s) Description<span style="color: red;"> *</span></label>
            <textarea class="span6 form-control" rows="3" id="ctrlTxtDescription${id}" placeholder="Description" required></textarea>
        </div>

        <div class="form-item">
            <label class="labelcl" for="shorttitle">Recipient(s)<span style="color: red;"> *</span></label>
            <div id="ctrlpplRecipients${id}"></div>
            <input type="hidden" id="ctrlTxtRecipientID${id}" />    
            <!-- 修正id重复问题 -->
            <label id="RecipientsInfo${id}" style="display:none; color:red">Please enter a valid user</label>                          

        </div>
        
        <div class="form-item">
            <label class="labelcl" for="shorttitle">Due Date<span style="color: red;"> *</span></label>
            <input class="form-control" type="date" id="ctrlDTDueDate${id}" style="border: 1px solid #b3b3b3;"/>
        </div>                  
                                                                                    
    </div>`);
    initializePeoplePicker(`ctrlpplRecipients${id}`, true);
})
验证说明

修改后每次新增行不会重置已有的DOM结构,所有初始化完成的People Picker都会保留内部输入元素和事件绑定,所有行的人员选择控件都可正常搜索输入。

内容的提问来源于stack exchange,提问作者MWAN001

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:45:07