dojox.grid.EnhancedGrid刷新时丢失焦点问题求助
解决EnhancedGrid刷新时丢失输入框焦点的问题
听起来这个焦点丢失的问题确实挺影响用户体验的,我之前做Dojo项目时也碰到过类似情况,给你分享几个可行的解决思路:
方法一:刷新前后手动保存并恢复焦点
这是最直接的应急方案,在触发网格刷新前先记录当前的焦点元素,等刷新完成后再把焦点切回输入框,还能顺便把光标定位到内容末尾,让输入更流畅:
// 假设你的搜索输入框id是"searchInput" const searchInput = document.getElementById("searchInput"); // 绑定到输入框的输入事件里 searchInput.addEventListener('input', function() { // 先保存当前焦点元素 const currentFocus = document.activeElement; // 更新store的查询条件(这里替换成你的搜索逻辑) storetoc.query({ keyword: this.value }); // 调用网格刷新,用回调确保DOM更新完成后再恢复焦点 gridtoc.refresh(() => { if (currentFocus === searchInput) { searchInput.focus(); // 把光标移到输入内容末尾,提升体验 searchInput.setSelectionRange(this.value.length, this.value.length); } }); });
方法二:避免全量刷新,让网格响应数据变化
如果你的场景只是数据更新(而非网格结构变更),其实不用调用refresh(),直接更新store的查询条件即可——只要你的store是支持数据监听的类型(比如ItemFileWriteStore或dstore子类),网格会自动局部更新数据,不会触发全量重绘导致焦点丢失:
// 输入事件中直接更新store查询,网格会自动同步数据 searchInput.addEventListener('input', function() { storetoc.query({ keyword: this.value }, { cache: false }); });
这个方法更优雅,也不会打断用户的输入流程,优先推荐试试这个。
方法三:重写网格方法,禁用默认焦点跳转
如果上面两种方法都不适用,你可以尝试覆盖网格的默认刷新逻辑,阻止它把焦点自动移到表头单元格:
// 重写EnhancedGrid的_refresh方法,加入焦点保存与恢复逻辑 gridtoc._refresh = function() { const focusedElement = document.activeElement; // 调用原始的刷新逻辑 this.inherited(arguments); // 刷新完成后恢复之前的焦点 if (focusedElement) { focusedElement.focus(); } };
不过这个方法要谨慎使用,因为可能会影响网格的其他交互逻辑,建议先在测试环境验证没问题再上线。
内容的提问来源于stack exchange,提问作者Mooni
相关产品推荐
相关产品推荐

