我有一个很大的表,使用datatables.net 1.9.4
和jQuery
呈现。我先提取数据asynchronously
,然后在数据表初始化中设置aaData
和aoColumns
。
当它在Chrome
中几乎立即显示时,在IE9
中显示则需要6分钟。IE's
分析器说,offsetWidth
函数花费了96.7%的时间。 offsetWidth
在哪里,何时调用?我找不到那个名字的函数。
这是我的初始化选项:
aaData: data.Values,
aoColumns: data.Headers,
bProcessing: true,
bDeferRender: true,
bDestroy: true,
bFilter: false,
bPaginate: false,
bSort: false,
sScrollY: fnCalcDataTableHeight(690),
sScrollX: "100%",
bScrollCollapse: true,
bInfo: false,
我也有唯一的
aoColumnDefs
。谢谢。
最佳答案
offsetWidth
是元素的布局宽度的只读值,其中包括元素的宽度,水平填充,水平边框和滚动条(如果存在)。 jQuery的outerwidth()
提供相同的功能。
每次在DOM中添加元素或从DOM中删除某些元素时,都必须调整渲染树。当您添加新元素时,将发生重排和重绘,以使用新元素来计算文档的新布局,并使用新样式(如果有)在浏览器中重绘它。
现代浏览器尝试通过排队这些更改并立即刷新它们来进行一些优化,以尽量减少这些昂贵的操作。但是,当您的脚本要求提供诸如offsetWidth
之类的某些值时,无法应用这些优化,因为这是布局的值,必须清除队列中所有待处理的布局更改,然后将offsetWidth
的最终值返回给准确。因此,我们应尽量减少其使用。 Here's关于该主题的有趣读物。即使在最坏的情况下,Chrome仍会尝试进行一些优化,但IE则不会。
谈到您的问题,datatables插件可能在内部使用它。除了尝试更改插件外,您还可以采用其他方法。
使用DocumentFragment,自行生成所有表行,将它们附加到表中,然后在其上应用datatables小部件。如果行和列太复杂,请尝试使用模板引擎。从here中选择
上一次遇到此问题时,我们有一个复杂的表,并将行数限制为500,并使用了分页。如果您的表很简单,那么考虑到IE,您的阈值可能会很大,但不会更大:)
关于jquery - IE中的jQuery数据表优化,offsetWidth花费了96.7%的时间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21169087/