我有这个代码
$.getJSON( "https://domain.ltd/parse_data.php", function( data_recieved ) {
if (data_recieved.length) {
$.each(data_recieved, function(index, element) {
$( ".items" ).append( '<span>' + element.name + ' = ' + element.amount + '</span><br />' );
});
}
})
如您所见,它正在解析json并使用append
显示结果。但是,如果响应中有500行数据,则可能需要30秒才能追加全部500行。当它发生的时候,网站是没有反应的。
不仅如此,我的CPU使用率达到了50%。
我做错了吗?也许有一种更有效的方法来解析这么多数据并用jQuery动态显示它?
发布于 2020-07-24 08:57:03
我相信这是一个更好的解决方案
$.getJSON( "https://domain.ltd/parse_data.php", function( data_recieved ) {
if (data_recieved.length) {
var spns = '';
$.each(data_recieved, function(index, element) {
spns+='<span>' + element.name + ' = ' + element.amount + '</span><br />';
});
$( ".items" ).append(spns); // or use .html();
}
})
您的DOM树似乎很深&循环中的$( ".items" )
变得越来越昂贵。
发布于 2020-07-24 08:59:56
你可以改进你的代码,这样性能会更好。在代码的底部,我已经应用并描述了一些技巧。您可以在此页面的开发者控制台中查看已用时间。
// just for simulating your JSON
var dataRecieved = [];
for (var i = 0; i < 500; i++) {
dataRecieved.push({ name: 'Element ' + i, amount: parseInt(Math.random() * i) });
}
// $.getJSON( "https://domain.ltd/parse_data.php", function( data_recieved ) {
// optimization start here
console.time('test');
// use a simple for loop and save the length of received data
var element, dataReceivedLength = dataRecieved.length;
// create a variable and append all html to it
var dataMarkup = '';
// if you want to do it on only one element, use the id as selector.
// save the object to a variable
var $items = $('#first-collection');
// check if $items exist
if ($items.length && dataReceivedLength) {
for (var i = 0; i < dataReceivedLength; i++) {
element = dataRecieved[i];
dataMarkup += '<span>' + element.name + ' = ' + element.amount + '</span><br />';
}
// use html() instead of append() for performance reasons in this case
$items.html(dataMarkup);
}
console.timeLog('test');
// });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<p id="first-collection" class="items"></p>
https://stackoverflow.com/questions/63069870
复制相似问题