Type-Ahead Datalist Textbox点击Add后未重置,自定义开头匹配后列表无法恢复全量选项
问题根因
- 新增成功后未清空水果输入框:VB后端
btnAddStdFruit_Click方法的新增成功分支中,仅清空了起止时间输入框,没有清空txtAddStdFruit水果输入框的内容,输入框残留选中的Cherry值会触发筛选逻辑,自然只保留C开头的选项 - 异步回发后JS全局变量未更新:页面首次加载时,你将全量datalist内容存储在
Inputs.initialAddPanelFruitDataListContent、Controls.addPanelFruitOptions两个JS全局变量中,点击Add按钮是通过UpdatePanel做局部刷新,这两个变量不会自动更新,依然保留旧的筛选后的值,哪怕后端重新渲染了datalist,筛选逻辑依然基于错误的旧变量执行 - 筛选逻辑直接修改DOM:当前的开头匹配逻辑直接改写datalist的innerHTML,输入值后会直接覆盖原始全量选项,没有正确回退的基准
修复步骤
1. 后端新增成功后清空水果输入框
在VB代码的btnAddStdFruit_Click方法中,找到ctrAddedFrts > 0的判断分支,添加清空水果输入框的逻辑:
If ctrAddedFrts > 0 Then ' 原有清空逻辑 txtAddStart.Text = String.Empty txtAddStop.Text = String.Empty ' 新增:清空水果输入框 txtAddStdFruit.Text = String.Empty ' 原有后续逻辑保持不变 pnlValAddLocation.CssClass = Constants.VALIDATOR_PANEL_RESET_STYLE ResetStdRequestSet() ResetMenuFruitList() ResetStandardFruitList() BindLists() BindStdFruits() ' ... 其余代码无需修改
2. 监听异步回发事件重新初始化JS变量
在前端页面的脚本块中添加以下代码,监听UpdatePanel的异步回发完成事件,更新存储全量datalist的JS变量:
// 监听UpdatePanel异步回发完成事件 Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function() { // 重新获取最新渲染的datalist元素 Controls.addPanelFruitDataList = document.getElementById('dlParentFruit'); // 重新缓存全量选项列表 Controls.addPanelFruitOptions = Controls.addPanelFruitDataList.querySelectorAll('option'); // 重新缓存全量datalist的原始HTML Inputs.initialAddPanelFruitDataListContent = Controls.addPanelFruitDataList.innerHTML; // 主动触发一次筛选逻辑,输入框已清空会自动恢复全量选项 Methods.addNewFruitsFruitListStartsWith(document.getElementById('<%= txtAddStdFruit.ClientID %>')); });
完成以上两步即可解决问题,Add操作后datalist会自动恢复全量水果选项。
内容的提问来源于stack exchange,提问作者develCat
相关产品推荐
相关产品推荐

