我有一个使用Knockout.js 2.2.1显示信息流从服务器(使用socket.io,但我不认为重要)的单页网络应用程序。此应用程序还包含一个大型数据表,该数据表是使用Knockout的foreach
绑定从JSON对象创建的。 (表格很大,但不是很大:20列,200行左右)为什么Chrome在隐藏大型Knockout元素时使用更多的CPU?
由于表格很大,用户可以通过点击按钮来打开/关闭表格。数据<table>
被放置在<div>
元素中,我可以使用jQuery的.hide()
和.show()
方法(基本上通过设置和清除<div>
上的CSS display: none
)来隐藏/显示数据。
所有这些功能的作品。但是,我注意到在'关闭'(隐藏)大数据表后,Chrome的CPU使用率跳转 - 如果Knockout生成的表足够大,一直到100%。更有趣的是,这个只有发生在用户点击包含表格的<div>
元素内的某个地方时。当表被隐藏(并且CPU使用率高)时,单击页面上的其他位置将使CPU使用率恢复正常。该过程将随意重复。
另一个可能有用的注意事项:如果我停止从服务器传输数据,则不会发生此问题(或者,CPU使用率不明显)。在此页面上有一个Knockout视图模型,该模型管理来自服务器的流式数据以及从JSON对象创建此数据表。这两组数据在其他方面是完全分开的 - 没有任何更改的数据显示在表中,并且表中不包含事件绑定回视图模型。就好像Knockout模型的流数据更新正在导致数据表上的工作,即使没有流数据绑定到表。 和它只有当这个表是而不是显示!
快速摘要:
- 的Web应用程序使用淘汰赛加载页面时呈现一个大的数据表。
- 此表在
$(document).ready
启动隐藏着.hide()
,但使用.show()
显示,点击一个按钮后,可再次隐藏 - 如果鼠标点击的数据表中,在Chrome的CPU使用率会跳到表格被隐藏后,100%。
- 单击页面上的其他任何内容都会使CPU使用恢复正常。
其他相关信息:
- 的Chrome浏览器的JavaScript探查显示了CPU使用率过高,但它只是归类为(节目)的时间。
- Windows上的IE10和Firefox 20都不显示此问题。
任何想法这里发生了什么,或有其他疑难解答的建议吗?
的jsfiddle:
这里举例:http://jsfiddle.net/CTYMv/6/
看看加载小提琴后CPU使用率,它应该是低的。点击“Show Table”,然后点击弹出的div内的某个地方(灰色背景)。然后点击“隐藏表” - CPU使用率将显着增加。然后点击其他任何地方(白色背景),CPU将恢复正常。
你能提供一个小提琴吗? – C5H8NNaO4 2013-05-08 23:16:30
其实是的。我认为模拟会有点困难,但设法得到一个很好的例子。 – potatoe 2013-05-09 18:23:45
您的问题可能是由浏览器重排造成的?你检查过了吗? – 2013-05-09 19:02:51