内联编辑时如何保持jqGrid的水平滚动位置?

问题描述

| 我的页面上有一个jqgrid表,其中有很多列,因此网格比浏览器窗口宽,会出现水平滚动条。 问题是,当用户单击一行以开始编辑时,浏览器框架会向左滚动,从而使用户感到困惑,甚至有时会隐藏所选的单元格。 我已经尝试过在这里和这里找到的方法,但是它们对我不起作用-我可以获取当前的滚动位置,但无法设置。 单元格在columnModel中设置为可编辑,因此我在formatCell事件中获得滚动位置,并尝试使用以下代码在afterEditCell处设置滚动位置:
afterEditCell: function(rowid,cellname,value,irow,icol) { 

 jQuery(\"#list\").closest(\".ui-jqgrid-bdiv\").scrollLeft(scrollPosition);
 window.scrollTo(scrollPosition,0);
 if (window.pageXOffset) {window.pageXOffset = scrollPosition;};
 if (document.body.parentElement) {document.body.parentElement.scrollLeft = scrollPosition;};   
 if (document.body) {document.body.scrollLeft = scrollPosition;};
并且,这不会影响网格的行为-滚动到最左侧的位置。 还有其他方法可以实现吗?     

解决方法

在loadComplete函数上尝试这个
var offset = $(\"#\" + *subgrid_table_id*).offset();
var w = $(window);
var fromTop = offset.top - w.scrollTop();
$(\'html,body\').animate({
    scrollTop: offset.top - fromTop
},1);
该代码保留网格的最后位置     ,在setTimeout()中移动滚动代码,例如: setTimeout(function(){     grid2.closest(\“。ui-jqgrid-bdiv \”)。scrollLeft(scrollPosition);                            } 100);     ,@Andrus-为什么超时?无论如何,我在解决方案中实现了您的代码。 从jqgrid页面进行内联编辑:
onSelectRow: function(id){
    if(id && id!==lastSel){ 
        jQuery(\'#grid_id\').restoreRow(lastSel); 
        lastSel=id; 
    }
    jQuery(\'#grid_id\').editRow(id,true); 
},
我的版本没有向左“跳”的滚动:
onSelectRow: function(id){
    scrollPosition = jQuery(\'#grid_id\').closest(\".ui-jqgrid-bdiv\").scrollLeft();
    if(id && id!==lastSel){ 
        jQuery(\'#grid_id\').restoreRow(lastSel); 
        lastSel=id; 
    }
    jQuery(\'#grid_id\').editRow(id,true).scrollLeft(scrollPosition); 
},
    ,
onSelectRow: function(rowid,status,e){
  if (lastID) grid.jqGrid(\"restoreRow\",lastID);

  if (rowid !== lastID) {
    var scrollPosition = grid.closest(\".ui-jqgrid-bdiv\").scrollLeft();

    grid.jqGrid(\"editRow\",rowid,false,function(){
      setTimeout(function(){ $(\"input,select\",e.target).focus(); },10);
    });

    setTimeout(function(){ grid.closest(\".ui-jqgrid-bdiv\").scrollLeft(scrollPosition); },0);

    lastID = rowid;
  }
  else lastID = null;
}