【问题标题】:Appending rows to table inside form element with JavaScript slower than without the form element使用 JavaScript 将行附加到表单元素内的表格比没有表单元素慢
【发布时间】:2013-04-09 06:32:14
【问题描述】:

我最终将此问题报告为错误。似乎会影响 webkit 浏览器。 https://code.google.com/p/chromium/issues/detail?id=233677

下面的原始问题。


我正在使用带有 Christian Bach 的 tablesorter 2 插件的 jQuery 1.8.1 并遇到了一个特殊的问题。 (jQuery 1.7.1 和 tablesorter 1 也有同样的问题。)

我有一个包含数百行的表格,它在大约 1 秒内排序。

当我将表格包装在 HTML <form> 元素中时,tablesorter 插件变得非常慢。大约 500 行的表格需要 8 秒以上的时间进行排序。

我只调用 $("#table").tablesorter() 没有额外的参数,只是纯 HTML 没有其他 JavaScript 或 CSS。

此表的 HTML 约为 1.2mb,每个 <td> 都包含其他 HTML 元素,例如 <button><div><span><a>、...

您知道<form> 元素可能会干扰什么吗?谢谢,/w

编辑:这是一个只有 10 行的示例。将实际时间缩放到 500,并将表格包裹在 <form></form> 中,看看这如何减慢排序速度。 http://pastebin.com/95KAAb88

【问题讨论】:

  • 试试其他插件,tablesorter 最后一次更新是在 2008 年,是为 jQuery 1.2 编写的。例如。 github.com/padolsey/jQuery-Plugins/blob/master/sortElements/…datatables.net。此外,在jsfiddle.net 上制作您的问题的工作演示,而不是在 pastebin 上制作一个有问题的 php 文件也是一个明智的主意。
  • 我正准备说我已经将问题追溯到tableBody[0].appendChild(r[pos][j]); 线上的函数appendToTable(table, cache)。 @dtech,这是一个有效的 HTML 文档,而不是 PHP(您只需要下载 jQuery 和 tablesorter 并引用它们。)我没有 tablesorter 的 CDN,所以我没有使用 jsfiddle.net。我也不想发布完整的 HTML 页面;它非常难看并且> 1mb的文本。我查看了其他表格排序器,但这是项目选择和定制的(不影响性能)。我无权改变事情。
  • @dtech,我在这张桌子上尝试了 datatables.net,效果很好。如果可能,我将建议我们使用它。感谢您的推荐。我仍然对 <form> 完全搞砸了 tablesorter 感到好奇,但我只是将这个问题标记为已解决。
  • 我在使用 JQuery Mobile 时遇到了类似的问题。表格创建速度很快,直到我将它包装在一个表格中。我的解决方案是在表格构建后简单地将表格包装在表格中。

标签: javascript jquery html-table tablesorter


【解决方案1】:

我发现这个问题并不是 tablesorter 或 datatables 独有的。可能是我的 Chrome (23) 版本中的 JavaScript 引擎。

我创建了一个简单的 jsfiddle。 Firefox 20.0 似乎没有这个问题。

http://jsfiddle.net/wsams/yGpdv/27/

如果您打开 Web 开发人员控制台并运行此脚本,请注意 Appending child 时间。这是将行追加到表所需的时间。

经过几次后,只需像这样将表格包裹在<form>中,

<form>
<table>
    <thead>
        <tr>
            <th>count</th>
            <th>link</th>
            <th>input</th>
            <th>button</th>
            <th>count</th>
            <th>link</th>
            <th>input</th>
            <th>button</th>
        </tr>
    </thead>
    <tbody>
        <tr id="tr1">
            <td>item 1</td><td><a href="text.html?key=value&amp;dog=poodle&amp;cat=siamese">a big link</a></td><td><input type="text" value="something" /></td><td><button type="submit" name="test" value="why">why this</button></td><td>item 1</td><td><a href="text.html?key=value&amp;dog=poodle&amp;cat=siamese">a big link</a></td><td><input type="text" value="something" /></td><td><button type="submit" name="test" value="why">why this</button></td>
        </tr>
    </tbody>
</table>
</form>

现在再次运行脚本并记下Appending child 次。我看到它从每次追加约 0.040 毫秒到约 8 毫秒。当您添加更多行时,它似乎也呈指数级增长。

对我来说,这肯定是原生 JavaScript DOM 函数的问题,但我不是这方面的专家。

【讨论】:

  • 我在 github 上确实有一个更新的 tablesorter 分支:mottie.github.io/tablesorter/docs 原始插件的问题是它会将每一行一次添加到 DOM 中,这是一种慢得多的方法而不是一次性完成。我没有将此添加为答案,因为我不确定为什么将其包装在一个表单中会产生如此大的不同。 Datatables 是一个不错的选择,但我不喜欢它,因为它的大小超过 200k,这就是我开始更新 tablesorter 的原因。
  • 嗨@Mottie。我试了一下你的版本,速度有点快,但我正在处理的非常大的表仍然有类似的问题。我希望我能把它换成你的,因为我们有很多定制和 Java 逻辑来构建表格。我相信我在数据表方面遇到了更严重的问题。这张桌子只需要重新设计;它不应该是兆字节的纯文本。感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 2016-12-31
  • 2015-01-28
  • 1970-01-01
  • 2013-12-27
  • 2015-03-09
  • 1970-01-01
  • 2013-10-24
  • 2013-05-13
相关资源
最近更新 更多