Mootools Multiselect check all在Internet explorer中非常慢

Mootools Multiselect check all is very slow in Internet explorer

本文关键字:explorer 非常 Internet Multiselect check all Mootools      更新时间:2023-09-26

当我们在分组多选下拉组件中有许多值(大约100个值)时,单击'All'链接时,我们面临性能问题。

这个问题只在IE8中发生,在其他浏览器中工作良好。在我们最初的分析之后,我们观察到

下面几行multiselect.js文件中的函数changeItemState在IE8中导致了这个问题。你能给我们提供解决这个问题的方法吗?

monitor.set('html', '
 + this.changeMonitorValue(item.getParent()) + 
);
monitor.title = this.getHoverTitle(item.getParent());

不确定你什么时候删除了实际的代码,但是当你说你有100个值-特别是getter -这可能是IE8或更低版本的问题。

javascript中的字符串是不可变的。这意味着如果你需要连接100个字符串,它将创建一个新的,添加下一个,并清理100次。这在IE中性能不是很好,因此很多人用Array.join('')代替:

var foo = 'a' + 'b' + 'c' + 'd', // faster in modern and mobile browsers
    bar = ['a','b','c','d'].join(''); // faster by ~50% IE7, IE8
http://jsperf.com/string-concat-vs-array-join-10000/9

然而,数组连接技巧在移动设备,android和现代浏览器中较慢。

另一个优化可以是添加更改处理程序,在表单操作(您的模型)期间将当前值导出到数组中,从而消除了在提交事件中一次获得100个值的需求。

由于节点的父节点是不可变的(很可能),没有必要一直去item.getParent(),你可以事先做一次,甚至直接引用item.parentNode来避免函数调用。

post changeMonitorValue源,可以在那里进行优化,因为它可能是次优的。我想你正在使用http://mootools.net/forge/p/mutiselect?

如果是这样,https://github.com/mlazz/MultiSelect/blob/master/Source/MultiSelect.js可以优化很多。然而,这是插件作者的事情。

要有创意