jqGrid在Chrome/Chrome Frame中无法正确呈现。

52

当前使用的是 Chrome v19.0.1084.46(官方版本 135956)beta-m jqGrid 4.3.2(最新版本)

问题在于,无论我的网格、列或包含 div 的大小如何,我的最后一列的一小部分都会被推到网格的边缘之外,导致出现了不应该出现的水平滚动条。如下所示:

grid

我一直在调整 jqGrid 的以下属性,试图解决这个问题:

  • width
  • autowidth
  • height
  • shrinkToFit
  • scrollOffset - 这个好像比较有效,但没有重复。

我也仅保留了基本的 grid css,以为可能是我自己加入的某个规则...但没有成功。

有没有其他人遇到过这个问题或找到了解决方法?感谢您的帮助。

8个回答

64

我今天将Chrome浏览器更新到了19版本,已经重现了问题并进行了相应的快速修复:

我建议更改jqGrid代码的这一行

isSafari = $.browser.webkit || $.browser.safari ? true : false;

to the following

isSafari = ($.browser.webkit || $.browser.safari) &&
    parseFloat($.browser.version)<536.5 ? true : false; // Chrome < version 19
这个演示使用了修复版的jquery.jqGrid.src.js。你可以在这里获取我在演示中使用的修复版。
我在IE9(v9.0.8112.16421),IE8(8.0.6001.18702CO),Chrome 18.0.125.168,Chrome 19.0.1084.46,Safari 5.1.7(7534.57.2),Firefox 12和Opera 11.62中进行了测试。在所有的Web浏览器中,演示没有水平滚动条,并且看起来如下所示: enter image description here 将来最好更深入地改变网格宽度的计算方式,以便不直接依赖于任何版本号或Web浏览器。如果在jqGrid的某些地方使用更多的jQuery方法$.width$.outerWidth,那么我希望这将是可能的。无论如何,我希望上述描述的修复已经对许多jqGrid用户有所帮助。 更新: 我将我的建议发布到了trirand上作为错误报告更新2:确切地说,在代码中有三个地方使用了与上述相同的$.browser.webkit || $.browser.safari结构:在setGridWidth内部在getOffset内部在计算multiselect列宽度内部在showHideCol内部在setGridWidth内部。前三个地方使用isSafari变量。后两个地方直接使用$.browser.webkit || $.browser.safari。应该在所有这些地方替换代码。
$.browser.webkit||$.browser.safari

to

($.browser.webkit || $.browser.safari) && parseFloat($.browser.version)<536.5

所以,应该在三个地方这样做:

  1. isSafari的定义中(参见我的原始帖子)
  2. showHideCol内部
  3. setGridWidth内部

您可以从此处下载具有所有修复程序的jquery.jqGrid.src的修复版本。如果您必须使用旧版本的jqGrid,则可以在jquery.jqGrid.src的代码中进行相同的更改。要创建用于生产的最小化版本,可以使用任何您熟悉的最小化工具。例如,我使用Microsoft Ajax Minifier 4.0。只需安装它并执行即可。

AjaxMin.exe jquery.jqGrid.src-fixed3.js -o jquery.jqGrid.min-fixed3.js

作为结果,您将获得jquery.jqGrid.min-fixed3.js,它比原始的jquery.jqGrid.min.js更小。即使您向文件添加注释头(请参见修改后的文件),该文件仍将比jquery.jqGrid.min.js的原始版本更小。
在我提交了一些错误报告并进行了改进后,修复程序的另一个版本引入了cellWidth方法。
cellWidth : function () {
    var $testDiv = $("<div class='ui-jqgrid' style='left:10000px'><table class='ui-jqgrid-btable' style='width:5px;'><tr class='jqgrow'><td style='width:5px;'></td></tr></table></div>"),
        testCell = $testDiv.appendTo("body")
            .find("td")
            .width();
        $testDiv.remove();
        return testCell !== 5;
}

请看这里。如果您更喜欢另一种方式,您也可以这样做。在所有使用isSafari$.browser.webkit || $.browser.safari(在showHideColsetGridWidth中)的地方,您可以使用$.jgrid.cellWidth()

更新3:今天发布了jqGrid 4.3.3,其中包含我上面描述的修复方法(cellWidth方法)。因此,我建议所有人使用新版本。

更新4:Google Chrome 20使用WebKit 536.11。因此,无法使用带有固定宽度计算的jqGrid最新版本的所有人都应该使用parseFloat($.browser.version)<536.11(或某些接近)而不是本答案开头描述的parseFloat($.browser.version)<536.5。Google Chrome 23 WebKit使用537.11。


1
问题是我的网格宽度完全混乱了链接 - user648929
2
@user648929:我无法调试图片!为了制作适用于您情况的新修复程序,我需要有能够重现问题的演示程序。您应该发布JavaScript代码以重现问题。 - Oleg
1
@JustinEthier:你说得对!当前的cellWidth函数代码仍存在一个bug。我认为我可以稍微改进一下代码。请看我的评论 - Oleg
1
我升级到了4.3.3版本,这个问题已经不再存在了。 - Steve
1
@Steve:没错。这是4.3.3发布的最重要原因之一。我上周让Tony做这个,但他很忙,今天才发布了4.3.3。我会添加“更新3:”。 - Oleg
显示剩余33条评论

3

奥列格的解决方案对我有帮助。

我只是编辑了最小版本

第49行:

替换:

m=b.browser.webkit||b.browser.safari ?!0: !1

为:

m=(b.browser.webkit || b.browser.safari) && parseFloat(b.browser.version)<536.5 ?!0:!1

感谢您的帮助!


只是想补充一下,这不是一个通用的解决方案。如果它对你有用,那太好了,但你可能需要查看Oleg的更新和更近期的答案。 - Justin Ethier

3

Oleg的回答是正确的。然而,如果您正在使用旧版本的jqGrid并希望应用这些修复,从Github上的差异直接获取更改可能更容易。我已经成功地使用jqGrid 4.0.0进行了测试,因此它应该适用于任何4.x系列。

只需从第一个差异开始,按顺序应用每个差异。这将添加cellWidth函数,并在jquery.jqGrid.src.js文件中进行所有必要的更改。然后,如果您想创建缩小版,可以使用Google Closure编译器:

  • {{链接1:8c56dc8}}
  • {{链接2:b50b55f}}
  • {{链接3:cf26b2c}}
  • {{链接4:8d7eff0}}
  • {{链接5:46a14ce}}

看起来有很多的变化,但是当你查看实际代码时,这些变化将非常快速。只有少数源代码行受到影响。


3
Chrome beta 20.0.1132.11已发布,报告如下:
User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 Safari/536.11

我猜想因为数字与文本比较导致补丁未被执行,所以536.11被认为小于536.5?
请帮忙!

jqGrid在线演示已更新为包含Oleg修复的最新版本。在使用Chrome 20时,您是否仍然在该页面上看到问题? - Justin Ethier
我在 Chromium 版本 20.0.1132.57 (0) 中发现了这个错误。我目前使用的是 jqGrid 4.4.0。有人应该测试一下最近推出的 Safari 6,并更改代码以针对旧版浏览器执行不良行为,而不是试图绕过不断出现的新版本构建。 - Lucas Holt
这是一条评论而不是答案。此外,Oleg在他的“更新4”中已经涵盖了这个问题。 - Zanon

1
我们使用jgGrid 4.3.3,但是cellWidth并没有解决问题...为了解决这个问题,我在cellWidth方法中添加了一行代码return parseInt(testCell) !== 5;代替return testCell !== 5;。也许这不是最好的解决方案,但对我们来说它有效 :)

1

我想指出这很可能是由于webkit 问题78412 最终得到解决。基本上,当计算具有固定布局的表格的宽度时,它不会考虑边框,以及我认为填充也是如此。

这意味着jqGrid将错误地将表格的宽度计算为其内容区域的宽度。因此,删除边框和填充也可以解决问题,但您可能不想这样做。


1

更新:我的回答是针对几个月前在Firefox中发生的类似问题,我希望这个解决方案也适用于Chrome 19,但目前Oleg的回答是正确的方法。

几个月前我在FF中遇到了类似的问题,我使用了ForceFit选项来完全禁用HScroll,但像你提到的那样,我仍然会遇到它,所以我只是为我的forcefit网格禁用了HScroll。几次FF更新后,它停止了发生,目前我所有的网格在Chrome 18中都很好,所以希望在19发布时不会出现问题。

//remove HScroll
function jqGridDisableHScroll(gridid) {
    //if columns are force fit all columns will always fit on screen.
    if ($('#' + gridid).jqGrid('getGridParam', 'forceFit')) {
        var gridview = $('#gview_' + gridid);
        $('.ui-jqgrid-bdiv', gridview).css({ 'overflow-x': 'hidden' });
    }
}

强制适应

如果设置为true,并且调整列的宽度,则相邻的列(右侧)将调整大小,以保持整个网格的宽度不变(例如,将第2列的宽度减少30px将使第3列的大小增加30px)。在这种情况下,没有水平滚动条。注意:此选项与shrinkToFit选项不兼容-即如果将shrinkToFit设置为false,则忽略forceFit。


不幸的是,它似乎无法正常工作。演示的函数成功地移除了滚动条,但无论 shrinkToFit 的状态如何,内容仍然超出网格区域。 - IronicMuffin
如果Chrome 19发布时这个问题仍然存在,那么我和你将面临同样的困境,这真是不幸。请问您能否确认演示页面http://www.trirand.com/blog/jqgrid/jqgrid.html上的网格是否存在此问题? - DisplayName
你是否将forcefit设置为true了? - DisplayName
是的,根据文档,我将forcefit设置为true。看起来问题确实存在于演示页面上(http://i.imgur.com/HfqFu.jpg)。 - IronicMuffin
只是为了澄清,这个问题与jqGrid和Chrome 19有关;请参阅Oleg的答案获取完整细节。 - Justin Ethier

0
在 jQGrid 4.5.2 和 Chrome 59.0.3071.115 中,我将 grid.base.js 中的 cellWidth 函数更改为:
 return Math.round(testCell) !== 5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接