数据由 json 返回var d={fields:["id","name","sex","age"],datas:[
["1001","张飞","男","21"],
["1002","吕布","男","21"],
["1003","赵云","男","21"],
["1004","曹操","男","21"],]};而具体创建table,有多种方法,例如 appendChild, insertrow, innerHTML, insertAdjustHTML 等,求最高速的方法另外,如果这样将全部数据储存在 var d 中,再生成table,会不会造成双倍的内存开销?毕竟json是服务端输出的,是否由服务端直接输出table会开销少一点?服务端生成页面和客户端生成页面 在大数据面前哪一个更有效???

解决方案 »

  1.   

    对的,服务端直接输出table会开销少一点,不过增加了服务器的负担,还有占了流量
    客户端生成页面,对客户端要求高点LZ要权衡利弊,根据自己的情况(服务器性能、网速、客户端性能等等),再作决定
      

  2.   

    客户端生成页面更有效,在大数据面前。因为现在客户端配置生成TABLE问题不大,极少数B端配置低下只影响极少数客户浏览,而增加了服务器负担将会影响所有客户浏览。
    建议采用innerHTML方法,先拼接HTML进数组,再join()后一次性innerHTML到窗口,切忌反复DOM渲染。CSDN有个叫梅子(meizi)的,去看看他(她)的BLOG ...
      

  3.   

    在JQuery中直接用html 字符串连接起来构成table就可以啦
      

  4.   

    服务器直接输出成 table格式会好些
    多不了什么开销, 如果开销大放到客户端一样要大开销的处理不如在输出时就直接处理
      

  5.   

    在下面这个链接有类似的讨论:
    http://topic.csdn.net/u/20090702/09/8cc31925-8cea-433c-bc36-01d5de36ff0c.html里面给出了一个例子:
     <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <title> new document </title>
    <meta name="generator" content="editplus" />
    <meta name="author" content="" />
    <meta name="keywords" content="" />
    <meta name="description" content="" />
    </head><body>
    <div id="test1"></div>
    <input type="button" onclick="innerTest()" value="testInnerHTML">
    <div id="test2"></div>
    <input type="button" onclick="appendTest()" value="testAppendChild"><script type="text/javascript">
    <!--
    function innerTest(){
    var t1=(new Date()).getTime();
    var a="<b>xxxxxxxx</b>";
    var b=document.getElementById("test1");
    for(var i=0;i<500;i++){
    b.innerHTML+=a;
    }
    t2 = (new Date()).getTime();
    alert(t2-t1);
    }function appendTest(){
    var t1=(new Date()).getTime();
    var b=document.getElementById("test2");
    for(var i=0;i<500;i++){
    var a=document.createElement("b");
    a.appendChild(document.createTextNode("xxxxxxxx"));
    b.appendChild(a);
    }
    t2 = (new Date()).getTime();
    alert(t2-t1);
    }
    //-->
    </script>
    </body>
    </html>
    如果你根据上面的例子就认为appendChild比innerHTML快,那你就错了,再看我修改过的这个例子: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <title> new document </title>
    <meta name="generator" content="editplus" />
    <meta name="author" content="" />
    <meta name="keywords" content="" />
    <meta name="description" content="" />
    </head><body>
    <div id="test1"></div>
    <input type="button" onclick="innerTest()" value="testInnerHTML">
    <div id="test2"></div>
    <input type="button" onclick="appendTest()" value="testAppendChild"><script type="text/javascript">
    <!--
    function innerTest(){
    var t1=(new Date()).getTime();
    var a="<b>xxxxxxxx</b>";
    var arr = [];
    var b=document.getElementById("test1");
    for(var i=0;i<500;i++){
    arr.push(a);
    }
    b.innerHTML += arr.join("");
    t2 = (new Date()).getTime();
    alert(t2-t1);
    }function appendTest(){
    var t1=(new Date()).getTime();
    var b=document.getElementById("test2");
    for(var i=0;i<500;i++){
    var a=document.createElement("b");
    a.appendChild(document.createTextNode("xxxxxxxx"));
    b.appendChild(a);
    }
    t2 = (new Date()).getTime();
    alert(t2-t1);
    }
    //-->
    </script>
    </body>
    </html>
    最后给你写一个相对比较快速的table 创建代码,自己改造着用吧:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>test</title>
    <script type="text/javascript">
    var d = {
    fields:["id","name","sex","age"],
    datas:[ 
    ["1001","张飞","男","21"], 
    ["1002","吕布","男","21"], 
    ["1003","赵云","男","21"], 
    ["1004","曹操","男","21"]
    ]
    }; var arrD = d.datas;for(var i=0;i<10000;i++){
    arrD.push([i,"test","test","test"]);
    }//这是一个相对比较快速的 table 创建方法:
    /*
    要点1,用array 的join方法而不是用"+"来连接字符串。
    要点2,生成的html包裹在一个统一的块级元素中(比如table,div等)提交,而不要分开提交(比如生成多个tr重复添加给一个table)。
    */
    function CreateTable(arr){
    var arrHTML = [];
    for(var i=0,j=arr.length;i<j;i++){
    arrHTML.push(arr[i].join("</td><td>"));
    }
    return "<table><tr><td>" + arrHTML.join("</td></tr><tr><td>") + "</td></tr></table>";
    }//下面创建DOM节点来创建table:
    function CreateTableByDom(arr){
    var _table = document.createElement("table");
    var _tbody = document.createElement("tbody");
    var _tr,td;
    for(var i=0,j = arr.length;i<j;i++){
    _tr = document.createElement("tr");
    for(var x=0,y = arr[i].length; x<y; x++){
    _td = document.createElement("td");
    _td.appendChild(document.createTextNode(arr[i][x]));
    _tr.appendChild(_td);
    }
    _tbody.appendChild(_tr);
    }
    _table.appendChild(_tbody);
    return _table;
    }
    function testCreateTable(){
    var t1=(new Date()).getTime();
    document.getElementById("container").innerHTML = CreateTable(arrD);
    t2 = (new Date()).getTime();
    alert(t2-t1);
    }
    function testCreateTableByDom(){
    var t1=(new Date()).getTime();
    document.getElementById("container").appendChild(CreateTableByDom(arrD));
    t2 = (new Date()).getTime();
    alert(t2-t1);
    }
    </script>
    <style type="text/css">
    table{
    border:#000000 1px solid;
    }
    td{
    border:#000000 1px solid;
    }
    </style>
    </head><body>
    <input type="button" value="生成table innerHTML方法" onclick="testCreateTable()"/>
    <input type="button" value="生成table DOM插入方法" onclick="testCreateTableByDom()"/>
    <div id="container"></div>
    </body>
    </html>我不知道还有没有更快的方法,期待大虾来给个最终解决方案。
      

  6.   

    <div id="demo"></div>
    <script>
    var json = {
    fields: ["id", "name", "sex", "age"],
    datas: [
    ["1001", "张飞", "男", "21"], 
    ["1002", "吕布", "男", "21"], 
    ["1003", "赵云", "男", "21"], 
    ["1004", "曹操", "男", "21"]
    ]
    };

    function createTable(json){
    var i, j, head = json.fields, data = json.datas;
    for (i = 0; i < head.length; i++) {
    head[i] = '<td>' + head[i] + '</td>';
    }
    for (i = 0; i < data.length; i++) {
    for (j = 0; j < data[i].length; j++) {
    data[i][j] = '<td>' + data[i][j] + '</td>';
    }
    data[i] = data[i].join('');
    }
    head = '<tr>' + head.join('') + '</tr>';
    data = '<tr>' + data.join('</tr><tr>') + '</tr>';

    return '<table>' + head + data + '</table>';
    }
    window.onload = function(){
    document.getElementById('demo').innerHTML = createTable(json);
    }
    </script>
      

  7.   

    结论非常明显,就是绝对要减少对DOM的操作,因为每操作一次,都要导致浏览器重新解析页面所以用字符串一次性更新的办法最块!也就是 innerHTML