jquery – 为什么Chrome使用更多的CPU当一个大的Knockout元素被隐藏?

前端之家收集整理的这篇文章主要介绍了jquery – 为什么Chrome使用更多的CPU当一个大的Knockout元素被隐藏?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个单页面的web应用程序,使用Knockout.js 2.2.1显示从服务器(使用socket.io,虽然我不认为重要)的信息流。这个应用程序还包含一个大型数据表,它是使用Knockout的foreach绑定从JSON对象创建的。 (表是大的,但不是巨大的:20列和200行左右。)

由于表大,因此可以由用户通过点击按钮来打开/关闭。数据< table>放置在< div>元素,我可以隐藏/显示使用jQuery的.hide()和.show()方法(本质上工作通过设置和清除CSS显示:无在< div>)。

所有这些功能都有效。但是,我注意到,在“关闭”(隐藏)大数据表之后,Chrome的cpu使用率会跳转 – 一直到100%,如果Knockout生成的表足够大。更有趣的是,这只发生在用户点击了< div>显示时包含表的元素。当表被隐藏(并且cpu使用率很高)时,单击页面上的其他位置将使cpu使用率恢复正常。该过程将随意重复。

另一个可能有用的注意事项:如果我停止从服务器的流数据,这个问题不会发生(或者,它不是显着的cpu使用)。此页面上有一个Knockout视图模型,它管理来自服务器的流数据和从JSON对象创建此数据表。两组数据以其他方式完全分离 – 表中不显示任何更改的数据,并且该表不包含回到视图模型的事件绑定。就好像Knockout模型的流数据更新导致对数据表的工作,即使没有流数据被绑定到表。它只有当表不显示时才这样做!

快速总结:

> Web应用程序使用Knockout在加载页面时呈现大型数据表。
>这个表在$(document).ready启动时被.hide()隐藏,但是在点击按钮后使用.show()显示,并且可以再次隐藏
>如果鼠标在数据表内被点击,Chrome的cpu使用率将在表再次隐藏后跳转到100%。
>点击页面上的任何其他内容将使cpu使用率恢复正常。

其他相关信息:

> Chrome JavaScript分析器显示cpu使用率,但它被简单地分类为(程序)时间。
> Windows上的IE10和Firefox 20都没有显示此问题。

任何想法,这里发生了什么,或建议额外的故障排除?

jsFiddle:

示例:http://jsfiddle.net/CTYMv/6/

看看cpu使用率加载后的小提琴,它应该是低的。点击“显示表格”,然后点击弹出的div内部(灰色背景)。然后单击“隐藏表” – cpu使用率将显着增加。然后单击任何地方(白色背景),并且cpu将恢复正常。

解决方法

我想我们现在可以认为这是webkit引擎中的一个错误。这个bug只出现在使用css属性display:none ;.是因为GPU如何使用webkit渲染隐藏的元素?嗯,我还是不知道…

SEE DEMO

这是我能想到的最简单的解决方法,这不应该干扰任何您的其他代码:{eg knockout observable}

CSS:
{添加指针 – 事件由Brandon建议}

.hidden{opacity:0;pointer-events:none} //don't use display:none here

JS:

//don't use hide/show jq methods as internally it set display none (fadeOut() methods too)
$('#btn_show').click(function(){
    $('#bigdatadiv').removeClass('hidden');
});
$('#btn_hide').on('click',function(){    
   $('#bigdatadiv').addClass('hidden')
});

我知道这只是一个解决方法,仍然不能回答你的问题:为什么会发生?

猜你在找的jQuery相关文章