【问题标题】:jqGrid does not render correctly in Chrome/Chrome FramejqGrid 在 Chrome/Chrome 框架中无法正确呈现
【发布时间】:2012-05-22 05:56:42
【问题描述】:

目前使用 Chrome v19.0.1084.46 (Official Build 135956) beta-m jqGrid 4.3.2(最新版本)

问题是,无论我的网格、列或包含 div 的大小,我最后一列的一小部分被推到网格边缘之外,导致出现水平滚动条,这是不应该发生的。见下文:

我一直在使用 jqGrid 上的以下属性来尝试解决这个问题:

  • width
  • autowidth
  • height
  • shrinkToFit
  • scrollOffset - 祝你好运,但没有可重复的。

我也只精简到了基本的网格 css,认为这可能是我制定的规则......没有运气。

有其他人经历过这种情况和/或找到解决方法吗?非常感谢您的帮助。

【问题讨论】:

    标签: javascript jquery css google-chrome jqgrid


    【解决方案1】:

    在带有 Chrome 59.0.3071.115 的 jQGrid 4.5.2 中,我将 grid.base.js 中的 cellWidth 函数更改为:

     return Math.round(testCell) !== 5
    

    【讨论】:

      【解决方案2】:

      Chrome 测试版 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 评估为

      请帮忙!

      【讨论】:

      • jqGrid 在线演示已更新为包含 Oleg 修复程序的最新版本的 jqGrid。您在使用 Chrome 20 时仍然在该页面上看到问题吗?
      • 我在 Chromium 版本 20.0.1132.57 (0) 中看到了这个错误。我目前正在使用 jqGrid 4.4.0。应该有人测试最近发布的 Safari 6 并更改代码以针对旧浏览器执行糟糕的行为,而不是试图破解总是会不断发生的新版本。
      • 这是评论而不是答案。此外,奥列格的回答已经在他的“更新 4”中涵盖了这一点。
      【解决方案3】:

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

      我建议更改jqGrid代码的the line

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

      到下面

      isSafari = ($.browser.webkit || $.browser.safari) &&
          parseFloat($.browser.version)<536.5 ? true : false; // Chrome < version 19
      

      The demo 使用此修复程序。我在演示中使用的jquery.jqGrid.src.js的固定版本你可以得到here

      我在 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 浏览器中,该演示都没有水平滚动条,如下所示:

      将来最好将网格宽度的计算更深地更改为不直接依赖于任何版本号或网络浏览器。我希望在 jqGrid 的某些地方使用更多的 jQuery 方法 $.width$.outerWidth 是可能的。无论如何,我希望上述修复已经对许多 jqGrid 用户有所帮助。

      已更新:我以the bug report 将我的建议发布给trirand。

      更新 2:确切地说,代码中有三个地方使用了与上述相同的 $.browser.webkit || $.browser.safari 构造:inside setGridWidthinside of getOffsetinside of calculation of the width 的 @987654345 @ 列,inside showHideColinside setGridWidth。前三个地方使用isSafari 变量。最后两个地方直接使用$.browser.webkit || $.browser.safari。应该在所有地方替换代码

      $.browser.webkit||$.browser.safari
      

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

      所以应该在三个地方做到这一点:

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

      您可以下载jquery.jqGrid.src 的修复版本,其中包含所有修复here。如果您必须使用旧版本的 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更小。即使您将注释标题添加到文件中(请参阅modified file),文件仍将比jquery.jqGrid.min.js 的原始版本更小。

      在我的bug reportthe improvements 的一些迭代之后,还有一个修复版本,其中引入了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;
      }
      

      here。如果您更喜欢遵循这种方式,您也可以这样做。如果在所有使用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)&lt;536.11(或接近)而不是答案开头描述的parseFloat($.browser.version)&lt;536.5。 Google Chrome 23 WebKit 使用 537.11。

      【讨论】:

      • 问题是我的网格宽度完全搞砸了link
      • @user648929:我无法调试图片!要进行适用于您的情况的新修复,我需要重现问题的演示。您应该发布重现问题的 JavaScript 代码
      • @JustinEthier:你是对的! cellWidth 函数的当前代码中仍然存在一个错误。我想我可以稍微改进一下代码。看my comment
      • 我升级到了 4.3.3,这不再是个问题了。
      • @Steve:没错。这是 4.3.3 发布的最重要原因之一。我上周要求托尼这样做,但他很忙,今天才发布 4.3.3。我将添加“更新 3:”。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        只是想指出这很可能是由于 webkit issue 78412 最终得到解决。在计算具有固定布局的表格的宽度时,基本上它不会考虑边界,我也相信填充。

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

        【讨论】:

          【解决方案6】:

          更新:我的回答是指几个月前在 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 列乘 30 像素)。在这种情况下,没有水平滚动条。注意:此选项与 shrinkToFit 选项不兼容 - 即如果将 shrinkToFit 设置为 false,则忽略 forceFit。

          【讨论】:

          • 不幸的是,它似乎不起作用。 demo的函数成功移除了滚动条,但是内容还是溢出了网格区域,不管shrinkToFit的状态如何。
          • 那很不幸,因为如果 Chrome 19 发布时这个问题仍然存在,我将和你在同一条船上。您能否在演示页面上确认网格是否存在此问题trirand.com/blog/jqgrid/jqgrid.html
          • 你也将 forcefit 设置为 true 吗?
          • 是的,我根据文档将 forcefit 设置为 true。 demo page 上似乎有问题
          • 澄清一下,问题出在 jqGrid 和 Chrome 19 上;有关详细信息,请参阅 Oleg 的答案。
          【解决方案7】:

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

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

          看起来有很多变化,但是当您查看实际代码时,变化会很快发生。只有少数源代码行受到影响。

          【讨论】:

            【解决方案8】:

            Oleg 的解决方案对我有用。

            我刚刚编辑了最小版本

            第 49 行:

            替换:

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

            与:

            m=(b.browser.webkit||b.browser.safari)&&parseFloat(b.browser.version)

            感谢您的帮助!

            【讨论】:

            • 只是想补充一点,这不是一个通用的解决方案。如果它对你有用,那就太好了,但你可能想看看 Oleg 的更新和最近的答案。
            猜你喜欢
            • 2020-01-10
            • 1970-01-01
            • 2012-01-26
            • 2023-03-19
            • 2017-04-24
            • 2019-05-28
            • 2018-02-27
            • 1970-01-01
            相关资源
            最近更新 更多