编写更快地加载表格
问题
你打算加载一个具有1000个姓名个地址的json数据对象,并用jq以这些数据创建一个表格。在IE7中创建这个表格花费
5~10秒,这还不包括下载时间。
json数据格式如下:
{ "name":{ { "first":"alice", "last":"tom", "street":"221B", "city":"beijing", "state":"VA", "zip":"15445" }, //重复1000个姓名 } }
js代码如下
function esc(){ return text .replace('&','&') .replace('<','<') .repalce('>','>'); } $(document).ready(function () { function fillTable(names) { $.each(names,function () { $('<tr>') .append($('<td>').addClass('name').html( esc(this.first) + '' + esc(this.last) )) .append($('<td>').addClass('address').html( esc(this.street) + '<br/>' + esc(this.city) + ',' + esc(this.state) + '' + esc(this.zip) )) .appendTo('#nameTable'); }); } $getJSON('names/names-1000.json',function (json) { fillTable(json.names); }); });
heml代码
<table id="nameTbale"> </table>
看似没毛病,但它运行得太慢了。
解决方案:
组合多种优化方案:
- 插入一个<table>或者<tbody>代替多个<tr>元素。
- 使用.innerHTML或.html()代替DOM操作。
- 用a[++i]和.join()构建数组,代替字符串连接。
- 使用基本的for循环代替$.each.
- 减少名称查询。
优化的结果代码如下(使用esc()函数):
$(document).ready(function () { function fillTable(names) { //用局部函数名称减少名称查找 var e = esc; // var html = [], h = -1; html[++h] = '<table id="nameTable">'; html[++h] = '<tbody>'; for (var name, i = -1; name = names[++i];) { html[++h] = '<tr><td class="name">'; html[++h] = e(name.first); html[++h] = ''; html[++h] = e(name.last); html[++h] = '<td><td class="address">'; html[++h] = e(name.street); html[++h] = '<br/>'; html[++h] = e(name.street); html[++h] = ''; html[++h] = e(name.state); html[++h] = ''; html[++h] = e(name.zip); html[++h] = '</td></tr>'; } html[++h] = '</tbody>'; html[++h] = '</table>'; $('#container')[0].innerHTML=html.join(''); } $.getJSON('name/names-1000.json',function (json) { fillTable(json.names); }); });
html代码
<div id="container"> </div>
在IE中的一个测试系统上,新代码仅仅运行0.2秒,而原来的代码运行了7秒。快34倍!
(数据来源《jQuery Cookbook》)
ps:
虽然简洁度降低了,但是访问者又不在乎,他们只重视加载速度。
相关推荐
移动开发与培训 2020-08-16
ReunionIsland 2020-08-16
行吟阁 2020-08-09
表格的现在还是较为常用的一种标签,但不是用来布局,常见处理、显示表格式数据。在HTML网页中,要想创建表格,就需要使用表格相关的标签。<table> <tr> <td>单元格内的文字</td> ...
gufudhn 2020-08-09
swiftwwj 2020-07-05
pythonclass 2020-06-25
nercon 2020-06-14
玫瑰小妖 2020-06-07
pythonclass 2020-06-03
lyg0 2020-05-28
huzijia 2020-05-08
行吟阁 2020-05-11
黎豆子 2020-05-11
玫瑰小妖 2020-05-11
HSdiana 2020-05-10
黎豆子 2020-05-08