前台页面显示一个若干行列的Table,行列数由后台服务器传递的总记录来计算,通过Firebug可以查看到数据传授到前后至正常显示Table的这段时间很长,用户估计等不及,所以我认为JS的代码有很大的优化空间,请教这里的JS高手,怎么优化这段js代码.页面需要easyUI的Slider控件!function renderTable(rsp) {
var count =rsp.length ;//总记录数
var rows = 20;
var cols = Math.ceil(count / rows); var str = '<table class="tbl">';
str += '<tr>'; for (var i = 0; i < cols; ++i) {
str += '<th >列名1</th><th >列名2</th>';
}
str += '</tr>'; for (var i = 0; i < rows; ++i) {
str += '<tr>';
for (var j = 0 + i; j < count; j = j + rows) {
str += '<td class="clsOne">' + rsp[j].Age+ '</td><td class="clsTwo"><input id="' + rsp[j].NumberTotal+ '" class="easyui-slider"/></td>';
}
str += '</tr>';
}
str += '</table>';
$('.divTable').append(str);
$('.easyui-slider').slider({
showTip: true,
min: 0,
max: 150,
step: 1,
tipFormatter: function (value) {
return value + '岁';
}
});
//table渲染css
$("tr").not(':first').hover(
function () {
$(this).css("background", "red");
},
function () {
$(this).css("background", "");
});
$.parser.parse($('#frmName'));
}优化firebugeasyUI
var count =rsp.length ;//总记录数
var rows = 20;
var cols = Math.ceil(count / rows); var str = '<table class="tbl">';
str += '<tr>'; for (var i = 0; i < cols; ++i) {
str += '<th >列名1</th><th >列名2</th>';
}
str += '</tr>'; for (var i = 0; i < rows; ++i) {
str += '<tr>';
for (var j = 0 + i; j < count; j = j + rows) {
str += '<td class="clsOne">' + rsp[j].Age+ '</td><td class="clsTwo"><input id="' + rsp[j].NumberTotal+ '" class="easyui-slider"/></td>';
}
str += '</tr>';
}
str += '</table>';
$('.divTable').append(str);
$('.easyui-slider').slider({
showTip: true,
min: 0,
max: 150,
step: 1,
tipFormatter: function (value) {
return value + '岁';
}
});
//table渲染css
$("tr").not(':first').hover(
function () {
$(this).css("background", "red");
},
function () {
$(this).css("background", "");
});
$.parser.parse($('#frmName'));
}优化firebugeasyUI
然后在循环体中创建 $("<tr><td>...</td></tr>") append 到 table 中
令,.html()与.append()哪一个效率高?可以一试
2 .hover 事件邦定改成live 用事件委托
3. 拼接str改成 var strs=[] ;strs.push(..) 用数组
你可以声明一个数组来保存数据,把+=的操作换成数组的push(),最后append()的时候,join("")一下。
var str = [];
str.push('<table class="tbl">');
....
$('.divTable').append(str.join(''));
一,Table中有五十个cell,数据应该不算多!涉及都交互,并且完整一屏能放下,不考虑分页!
二,传输的数据,我考虑把json字符串是否还能压缩!
1,不考虑分页
2,事件委托的思路,能否用代码解释一下?
3,好思路,我马上试试,只是js中的string数组允许多大的长度?
2,事件委托,不用在每个元素上邦定事件,在他们的父邦一个事件统一管理
你上面代码改成,只要在.tbl(table)上邦一个事件就可以了
$('.tbl').live('mouseover',function(evt){
var tr=$(evt.target);
if(!tr.index()) tr.css("background", "red");
});
$('.tbl').live('mouseout',function(evt){
$(this).css("background", "");
});3,string长度应该没有,真的连string长度超了,其它环节早跨了
嗯,请教您分布的意思把这个Table中的五十个被投票人选项逐步显示吗?
delegate的代码:$('.tbl').delegate('tr','hover', function( event ) {
if( event.type === 'mouseenter' )
$(this).css("background", "red");
else
$(this).css("background", "");
});
on的写法:$('.tbl').on(
{
mouseenter: function()
{
//stuff to do on mouseover
},
mouseleave: function()
{
//stuff to do on mouseleave
}
}
, 'tr');
my god,大牛! 受教了!
请问我用jquery的 $.each 是不是比js的for循环要快一些?
谢谢,明白了,如果以后多了,考虑jquery的异步加载!
数据目前就50条,数据传输的时间不多,在页面渲染阶段有明显的延迟.
这是关于html和append在不同浏览器下渲染的比较结果!
http://jsperf.com/jquery-append-vs-html
2)把要添加数据的最外层容器 先隐藏 添加完了在显示
3)可以考虑 整个添加过程 用settimeout
我试试2)
3)可以考虑 整个添加过程 用settimeout ,用这个函数,每隔一秒追加一行吗? 请用代码指教
var resObj = rsp[j];str = str + '<td class="clsOne">' + resObj.Age+ '</td><td class="clsTwo"><input id="' + resObj.NumberTotal+ '" class="easyui-slider"/></td>';效率就不一样了
第一段代码用 += 但后面还有多个 + 字符连接,这里会重复拷贝逐渐变大的字符串
而第二段代码,只是简单的将后面的字符串拷贝到str末尾而已
谢谢星星的回复,我写个测试,看看你的方法和push join 的时间差别
我的初步测试结果 你参考一下:读取记录五十条左右! win7 64bit 6G内存 2.4G双核
FireFox18 Chrome25 IE8
join push方式 681ms 306ms 1234ms
string拼接方式 435ms 335ms 1675ms整体来说还是 join push 方式效率高
发一段测试代码:
var s = ""
var start = new Date().getTime();
for(var i=0;i<3000000;i++){
s+="hello world! "
}
var end = new Date().getTime();
console.log(end - start)var arr = [];
var start = new Date().getTime();
for(var i=0;i<3000000;i++){
arr.push("hello world! ");
}
s = arr.join("");
var end = new Date().getTime();
console.log(end - start)/*firefox:6313
7309
chrome: 4762
3997
*/看样子哪个效率高还得看浏览器了,嘎嘎
另外:JQ的方法你如果看了底层实现的话 一样有很多地方可以优化改进 希望能对你有帮助。var cols = Math.ceil(count / rows);
var str = [];
str.push('<table class="tbl">', '<tr>')
for (var i = 0; i < cols; ++i) {
str.push('<th >列名1</th><th >列名2</th>');
}
str.push('</tr>');
for (var i = 0; i < rows; ++i) {
str.push('</tr>');
for (var j = 0 + i; j < count; j = j + rows) {
var item = rsp[j];
str.push('<td class="clsOne">' + item.Age
+ '</td><td class="clsTwo"><input id="' + item.NumberTotal
+ '" class="easyui-slider"/></td>');
}
str.push('</tr>');
}
str = str.join("");
str += '</table>';
$('.divTable').append(str);
谢谢 我改用了类似你的push方法,并且发现 innerHTML 在IE8中不支持 嘎嘎