【发布时间】:2014-04-23 22:25:57
【问题描述】:
我编写了一个代码,它在 DOM 中转储大量节点。当我在 firefox 中加载它时,它会在 2-3 秒 中呈现,但在 chrome (ver:33) 中它会冻结 UI 并且呈现需要 长时间(8-10秒)。
$.ajax({
xhr: function () {
var xhr = new window.XMLHttpRequest();
xhr.addEventListener("progress", function (evt) {
if (evt.lengthComputable) {
var percentComplete = evt.loaded / evt.total * 100;
$("#fetchProgress").attr("value", percentComplete);
}
}, false);
return xhr;
},
type: 'GET',
url: "/GetSomething",
data: {},
success: function (data) {
///process and dump to DOM//
var fileLines = data.split('\n');
var htmlString = '';
for (var i = 0; i < fileLines.length; i++) {
htmlString += '<span>' + (i + 1) + '. ' + fileLines[i]+</span>;
if ((i % 1000) == 0) {
$("#textPlace").append(htmlString);
htmlString = '';
}
}
fileLines = null;
$("#textPlace").append(htmlString);
}
});
我从互联网了解到 chrome 存在一些渲染错误,并尝试从该 URL 进行黑客攻击。 "Chrome Bug - window.scroll method intercepts DOM Rendering" 它开始工作,但现在又不工作了。请提出一些建议。 任何帮助表示赞赏。坦克大小提前致谢:)
【问题讨论】:
-
你可以在服务器上格式化文件,然后只追加一次字符串
-
尝试关闭 span 标签(例如:
... + fileLines[i] + '</span>';。这大大减少了我的简单测试用例的重新渲染时间。可能是因为 chrome 不需要修复损坏的 html。 -
@Yoshi:也试过关闭,但还没有改善。
-
一个很小的变化:将
$("#textPlace")移到for()之外,这样就不必一遍又一遍地查找元素。
标签: javascript jquery google-chrome firefox dom