我目前有一个真实性发电机的草图。它工作正常,但速度很慢。我使用jQuery添加到<table>
的每个布尔值组合。对于每个值,jQuery创建<td>
元素,然后将其添加到<table>
。此外,我正在使用jQuery UI来获得漂亮的按钮而不是单选按钮。
在我发布的代码提取中,table
是一个包含每个布尔组合的数组。也许我的代码有点难以理解,但它基本上归结为有4个布尔变量(16种可能性),96个<td>
元素是在添加了类和data
属性集的情况下创建的。在第二部分中,创建了三组三个单选按钮,并将其转换为jQuery UI按钮组。
使用计时器我发现在一切都被填满之前需要大约0.4秒。这并不是什么大不了的事,但它肯定是引人注目的,并且对用户没有正面影响,因为每次他输入一个不同的布尔公式时,需要半秒才能加载。
$table = $('#table');
$.each(table, function(k, v) {
$tr = $('<tr>').addClass('res').data('number', k);
$.each(v[0], function(k2, v2) {
$td = $('<td>').text(v2).addClass(v2 ? 'green notresult' : 'red notresult');
for(var i = 0; i < 4; i++) {
$td.data(i, i === k2);
}
$tr.append($td);
});
$tr.append($('<td>').addClass('spacing'));
$table.append(
$tr.append(
$('<td>').text(v[1]).addClass(v[1] ? 'green result' : 'red result')
)
);
});
// ... here is some code that's not slowing down
$radiobuttonsdiv = $('#radiobuttonsdiv');
for(var i = 0; i < 4; i++) {
var $radiobase = $('<input>').attr('type', 'radio')
.attr('name', 'a'+i)
.click(handleChange);
// .label() is a custom function of mine which adds a label to a radio button
var $radioboth = $radiobase.clone().val('both').label();
var $radiotrue = $radiobase.clone().val('true').label();
var $radiofalse = $radiobase.clone().val('false').label();
var $td1 = $('<td>').addClass('varname').html(i);
var $td2 = $('<td>').attr('id', i);
$td2.append($radioboth, $radiotrue, $radiofalse).buttonset();
var $tr = $('<tr>').append($td1, $td2);
$radiobuttonsdiv.append($tr);
}
我的问题是:
答案 0 :(得分:7)
尽量避免在循环中使用.append,尤其是在添加大量元素时。这始终是一个性能杀手。
更好的选择是使用标记建立一个字符串,并在循环结束时单独(或尽可能少).append。
我看到你正在使用.data,这使事情变得更复杂,但另一个选择是使用metadata插件将结构化标记附加到现有标签。
答案 1 :(得分:3)
要延迟渲染,您可以尝试创建新表而不将其添加到DOM,如:
var myDisconnectedTable = $('<table></table>')
然后将行添加到该表中:
myDisconnectedTable.append(...)
然后将您的表格附加到您想要的div
:
$('#idOfMyDiv').append(myDisconnectedTable)
我不知道它会有所帮助,但值得一试。