jQuery:当重复调用时,重绘函数的速度非常慢
jQuery: redrawing function extremely slow when called repeatedly
我有一个名为refreshHistory()的方法,它基本上读取本地存储的json列表(使用https://github.com/marcuswestin/store.js/)并按照它们存储的顺序填充列表。
每次用户操作发生时,都会调用此方法。但是,随着列表越来越大,浏览器的速度会减慢到爬行。
function refreshHistory() {
var records = typeof store.get('history') == "undefined" ? 0 : store.get('history').history;
;
if (records == 0) {
$('#content #historyView').html('<i>history show up here in order.</i>');
} else {
var xhistory = '<div id="history">';
for (var i = 0; i < records.length; i++) {
var xaction = records[i]
xhistory += '<div id="action">' + (i + 1) + '. ' + '<b>' + xaction.action + "</b> " + xaction.caption + '<span class="delaction" id=' + i + ' data-stamp="' + xaction.msg + '" style="color:red;cursor:pointer;">' + '[remove]' + '</span></div>'
}
xhistory += "</div>"
$('#qtip-0-content #historyView').html(xhistory);
}
}
在每个事件上渲染所有内容是一种简单的策略,这很好,但它确实会遇到您所描述的性能问题。很难给出具体的建议,但你也可以:
- 实现更详细的呈现逻辑,其中只呈现新项并将其添加到DOM中
- 使用ReactJs或Virtual DOM库,它们允许您的代码使用render everything模式,但通过执行所需的最少操作,使DOM的实际更新更快
真正提高效率的唯一方法是以不同的方式实现它。
我个人一直在使用knockout.js,对此我很满意。基本上,你写一个模板,库处理DOM节点的更改,只更新所需的部分。你需要学习如何以稍微不同的方式思考,但也有一些很棒的教程。
也就是说,你可以尝试的一个简单技巧是将选择器移到函数之外,这样它们只运行一次,而不是每次调用函数时。
为了保持理智,无论.get('history')
是否返回undefined
,我都会将records
变量保持为相同的类型。
var contentHistoryView = $('#content #historyView');
var qtipHistoryView = $('#qtip-0-content #historyView');
function refreshHistory() {
var records = typeof store.get('history') == "undefined" ? [] : store.get('history').history;
if (records.length) {
contentHistoryView.html('<i>history show up here in order.</i>');
} else {
var xhistory = '<div id="history">';
for (var i = 0; i < records.length; i++) {
var xaction = records[i]
xhistory += '<div id="action">' + (i + 1) + '. ' + '<b>' + xaction.action + "</b> " + xaction.caption + '<span class="delaction" id=' + i + ' data-stamp="' + xaction.msg + '" style="color:red;cursor:pointer;">' + '[remove]' + '</span></div>'
}
xhistory += "</div>"
qtipHistoryView.html(xhistory);
}
}
不过,我怀疑这会产生巨大的影响,因为我怀疑大部分执行时间都花在了循环中。
相关文章:
- 在固定间隔内调用 AJAX 函数是否会减慢应用程序的速度
- 鼠标速度 JavaScript 函数
- jQuery 事件回调速度:匿名与命名函数
- 在函数中做未使用的参数会减慢 JavaScript 的执行速度
- 我可以减慢这个Javascript函数的速度吗?
- JS计数器:在一个函数中设置不同的速度(间隔)
- 将对象传递到同一作用域内的函数的速度较慢
- jQuery:当重复调用时,重绘函数的速度非常慢
- 为什么加载 JavaScript 函数的工作速度比预期的慢
- Javascript函数可以降低滚动速度
- 如何比较两个Javascript函数的速度
- 包含函数的对象文字表示法的执行速度是否比(全局范围)普通函数(取消引用)更快
- 如何使setTimout函数以相同的速度运行
- 循环中的异步函数运行速度太慢.我该如何提高表现
- 当我使用setInterval函数时,画布中的对象会以指数级的速度增长
- 一个函数JQuery的速度不同
- 我将所有内容保存在外部.js文件中.但并不是所有的函数都在每个页面上使用.这会影响速度吗?
- Javascript中记忆fibonacci函数的奇怪速度结果
- 如何减慢jquery单击函数的执行速度?
- 如何降低执行函数的速度