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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:34:01