在向DOM加载大量数据方面,我遇到了一个大问题。事实上,只有IE11才是这个问题的症结所在。下面是一些示例代码,基本上我是这样做的:
var concat = [];
for (var i = 0; i < 10000; i++) {
concat[i] = "<li value='"+'XYZ' + i+"'>"+'XYZ ' + i+"</li>";
}
var element = conc.join('');
$('ul.mylist').append(element);
现在,它被分解成一个非常基本的例子,它的灵感来自于我在一个类似的主题中找到的jsFiddle:
http://jsfiddle.net/bVAFF/152/小提琴在IE中工作良好!
我插入大块的列表元素,最多~ 10,000。这执行得很好,因为我将单个元素连接成一个大字符串,最后附加到DOM。
至少它在Chrome和Firefox上表现很好,插入数据只需要1-2秒,而IE11需要几分钟才能从注入癫痫中恢复过来。我正在试验更大的数据量:高达9MB/70.000个元素的字符串(!)仍然加载"meh"(但当时我没有在IE上测试)。
我不得不承认,我真正注入的字符串比(非常简单)示例中的字符串大得多,但仍然:它在Chrome和FF上表现出色。只有IE死机了!
有人知道为什么会这样吗?
来自柏林的问候!
亚哈不考虑jquery,它会增加自己的开销,在IE中分配innerHTML相当快-
<!doctype html>
<html lang="en">
<head>
<meta charset= "utf-8">
<title>dynamic list</title>
<style>
</style>
<script>
onload= function(){
var start= new Date();
var pa= document.querySelector('ul.mylist'),
timer= document.querySelector('h1'),
conc= [];
for(var i= 0; i<10000; i++){
conc[i]= '<li title= "XYZ' + i+'">XYZ ' + i+'</li>';
}
pa.innerHTML+= conc.join('n');
str= ' time: '+(new Date()-start)+' milliseconds'
timer.appendChild(document.createTextNode(str));
}
</script>
</head>
<body>
<h1>New list </h1>
<ul class="mylist">
<li title="First list item">First list item</li>
</ul>
</body>
</html>
<!-- samples
IE 11: 130msec
Opera 22: 213 msec
FFox 31: 50msec
Chrome36: 125msec
-->
感谢到目前为止的回答,虽然他们不是很有帮助…
但是我必须承认,我在我的帖子中忘记了一个显然非常重要的细节。
我从SOAP信封中获取列表内容(大量内容),其中包含一个大的JSON字符串,稍后我将进行解析。
然而,XML SOAP信封的解析是冻结一切的操作!
$(data).find('json_content').text();
这是旧的操作。现在,当进行"手动"XML遍历时,我可以直接访问JSON字符串:
var jsonString =
data[0].documentElement.
childNodes[0].childNodes[0].childNodes[0].firstChild.nodeValue;
解析字符串、连接它,甚至将内容粘贴到DOM中现在只需要几秒钟。它比Chrome和Firefox慢,但现在(终于!)我说的是秒。不是。分钟。
我还测试了innerHTML,并将其与jQuery.append()进行了比较。
innerhtml也快不了多少。: P
from B!
为了子孙后代
我发现首先将包装器插入DOM(在它有任何子节点之前)可以将冻结页面的速度提高到只需要3秒
最初,我创建了一个文档片段,并在它被正确填充后附加它(尽管这是最佳实践)。显然,如果片段包含10k个子,则会使IE 11阻塞。