dojo datagrid 将在更改排序时使页面“跳转”

Posted

技术标签:

【中文标题】dojo datagrid 将在更改排序时使页面“跳转”【英文标题】:dojo datagrid will make the page "jump" when sorting is changed 【发布时间】:2011-01-29 09:59:40 【问题描述】:

我的一个页面中有一个 Dojo 数据网格(其中包含更多内容)并且出现以下问题:当我单击列标题以更改排序时,页面会跳起来,好像我单击了一些html 锚。

有趣的是,页面跳转将使网格在跳转后仅显示前两行,而不是(例如)在跳转后让网格从页面顶部开始,这是锚点时的预期行为被使用了。

这个问题出现在不同的浏览器中(测试:Firefox 3.6、Opera 10、IE6),所以我猜这可能是一个Dojo-problem/-bug。

有什么办法可以制止这种恼人的行为吗?

您好, 选择0r

PS:this 似乎描述了一个类似的问题,仅适用于 JQuery(不幸的是也没有解决方案)

【问题讨论】:

您能否提供一些代码/详细信息以供您使用网格?您是否已附加到网格上的任何事件?是否对网格中的数据应用了任何特殊格式?我已广泛使用网格,但从未见过这种行为,因此了解您在做什么不同会很有帮助。 加载页面,并确保 URL 末尾没有“#”。单击标题后,是否添加了“#”?如果是这样,听起来标题链接并没有阻止默认操作。你有示例页面吗? @Donal:我已经连接到“onStyleRow”,但仅此而已,其余的看起来像var grid = new dojox.grid.DataGrid( 'store' : store, 'structure' : structure, 'autoHeight' : true, 'autoWidth' : true (...),那里没有特色。 @Nick:单击标题将使 URL 保持不变(没有“#”)添加。不幸的是,我无法为您提供示例页面,因为网格是一个相当复杂的内部项目的一部分。 从代码中删除“autoHeight”似乎摆脱了“跳跃”,但我唯一看到的是标题,所以这是没有选择的。固定高度也没用因为所需的高度变化很大。 【参考方案1】:

在 DataGrid 和底层 _Grid 中存在一些作用力,它们可能导致网格在两次提取之间缩小到其标题行的高度,然后重新增长。如果您在滚动到页面底部时遇到您专门描述的行为,则您的浏览器可能会“向上滚动”(以便其视口底部与页面的新底部对齐),但是当表格加载新数据并再次调整大小,您的浏览器仍然“向上滚动”。

我花了一些时间研究 DataGrid 和 _Grid。我发现确实有两个原因:

    DataGrid 的 _clearData 函数,它调用 updateRowCount(0)(即在新结果出现之前将网格减少到 0 行)

    _Grid 的 _resize 函数,如果 _autoHeight 为 true(如果 autoHeight 为 true,或者是一个数字 >= rowCount,则似乎是这种情况)

    李>

如果您不反对弄乱源代码,您可以简单地从 DataGrid._clearData 中删除一行代码,从 _Grid._resize 中删除另一行代码并完成它;但是,假设您想要一种更简洁的方法,我尝试使用几种变通方法将 DataGrid 子类化。看看这对您来说如何。

dojo.provide('my.DataGrid');

dojo.declare('my.DataGrid', dojox.grid.DataGrid, 
  updateRowCount: function(inRowCount) 
    if (inRowCount > 0)  //ignore requests to set rowCount to 0
      this.inherited(arguments);
    
  ,
  _resize: function(changeSize, resultSize) 
    if (this._autoHeight) 
      //sizeblink workaround
      var _viewsNode = this.viewsNode;
      this.viewsNode = style: height: ''; //_Grid._resize crash dummy
      this.inherited(arguments);
      this.viewsNode = _viewsNode;
      //call post-functions again with node properly hooked
      this.adaptWidth();
      this.adaptHeight();
      this.postresize();
     else 
      this.inherited(arguments);
    
  
);
//carry over DataGrid's custom markupFactory, otherwise declarative won't work
my.DataGrid.markupFactory = dojox.grid.DataGrid.markupFactory;

希望它有所帮助,或者至少提供洞察力。我想知道这个问题是否应该作为dojo的trac中的错误输入......

【讨论】:

我们发现重置 DataGrid 是需要关注的问题,同时找到了解决方法(请参阅我的回答),但您的解决方案绝对受到青睐(即使我没有尝试过它还没有,但很快就会)。非常感谢! 我认为这是因为您设置了赏金,但在您标记它之前它就过期了。我承认我已经接近赏金的最后期限,所以我并没有真正期望得到它;)如果它最终对你有用,那么我很高兴它有所帮助。【参考方案2】:

这是一个快速而简单的解决方法:正如 CnEY 评估的那样,问题是 DataGrid 将自身重置为 0 行,然后再次用数据填充自身。

如果您使用具有网格高度最小高度的 DIV 将 DataGrid 括起来,则重置不会影响页面的高度,因此“跳跃”将停止。

当然,这只是一个基本的解决方法,因为即使使用 javascript 设置/更改,周围的 DIV 的高度也有些静态,所以我宁愿使用动态的东西(如 CnEY 发布的解决方案)。

【讨论】:

以上是关于dojo datagrid 将在更改排序时使页面“跳转”的主要内容,如果未能解决你的问题,请参考以下文章

将新项目添加到商店后 Dojo Datagrid 排序

以声明方式对 Dojo DataGrid 进行排序

以编程方式在 Dojo Datagrid 中自定义列排序

如何在没有 REST 请求的情况下在 GUI 中基于 dojo.store.jsonrest 对 Dojo DataGrids 进行排序?

dojo datagrid 1.7 在存储更改时自动更新

没有为 dojo 的 DataGrid 触发事件