Javascript渲染代码需要花费大量时间

时间:2017-06-16 07:43:18

标签: javascript jquery performance

我的js / jq代码有问题。我通过json中的$ .get下载数据并尝试使用循环来显示数据。我的代码有效,但有时候我的json数据有300-400条记录,redner需要花费很多时间。 我怎么能说这个呢?

我的代码:

var selectData = '';
var selectHtml = '';
var krzeselkaArray = [];

$(document).ready(function(){
    DownloadData(<?= h($q->id_kontrahent) ?>);
});

function turnOffLoader(){
    $('.loader').remove();
}

function DownloadData(oid){
    $.get("<?= $this->Url->build(['controller'=>'json','action'=>'KontrahenciKonfiguruj'],true)?>/"+oid, function(r){


        selectData = r.select;

        selectHtml = $('<select>');
        for(var x = 0, len = Object.keys(r.select).length; x < len ; x++){
            var obj = r.select[x];
            selectHtml.append($('<option>').val(obj.Tkaniny.id_tkaniny).text(obj.Tkaniny.nazwa));
        }


        for(var x = 0, len = Object.keys(r.konfiguracja.data).length; x < len; x++){
            var obj = r.konfiguracja.data[x];
            var obj_y = $('.konfiguratorHeaderTable').find('td[data-krzeselkoid="'+obj.id_krzesla+'"]').index();

            var konf_cache = $('.zaawansowana_edycja').find('tbody').find('tr.konfiguratorAttr[key="'+obj.TKA1.id_tkaniny+'|'+obj.TKA2.id_tkaniny+'"]');

            if(konf_cache.length == 0){
                var newHtml = $('<tr>');
                newHtml.addClass('konfiguratorAttr').attr('key',obj.TKA1.id_tkaniny+'|'+obj.TKA2.id_tkaniny);

                for(var t1=0;t1 < $('.konfiguratorHeaderTable').find('.obr').find('td').length; t1++){
                    newHtml.append('<td>');
                }

                $('.zaawansowana_edycja').find('tbody').append(newHtml);
            }

            konf_cache.find('td:first').html('<div class="col-sm-12"><select>'+selectHtml.html()+'</select></div><div class="col-sm-12"><select>'+selectHtml.html()+'</select></div>');

            var h2 = $('<div>');
            h2.addClass('col-sm-12');
            h2.append($('<input>').attr('type','text'));
            h2.append($('<input>').attr('type','text'));
            h2.append($('<input>').attr('type','text'));
            h2.append($('<input>').attr('type','text'));
            h2.append($('<input>').attr('type','text'));
            h2.append($('<input>').attr('type','text'));
            h2.append($('<input>').attr('type','text'));
            h2.append($('<input>').attr('type','text'));
            h2.append($('<input>').attr('type','text'));
            h2.append($('<input>').attr('type','text'));
            h2.append($('<input>').attr('type','text'));
            h2.append($('<input>').attr('type','text'));
            h2.append($('<input>').attr('type','text'));
            konf_cache.find('td').eq(obj_y).append(h2.html());




        }




        if(r){
            turnOffLoader();
        }

    },'json')
}

此外,我的代码生成的表格在每个td中包含10个输入。

3 个答案:

答案 0 :(得分:1)

您可以将本机浏览器工具与批量渲染结合使用。所以在开始时会发现document fragment

var element  = document.getElementById('ul'); // assuming ul exists
var fragment = document.createDocumentFragment();
var browsers = ['Firefox', 'Chrome', 'Opera', 
   'Safari', 'Internet Explorer'];

browsers.forEach(function(browser) {
    var li = document.createElement('li');
    li.textContent = browser;
    fragment.appendChild(li);
});

element.appendChild(fragment);

当您创建新标记时,将其附加到片段。现在它还没有渲染。继续做追加,直到你得到所有你需要的东西,然后将片段附加到新标签的位置。现在,浏览器在一个循环中呈现所有内容。

答案 1 :(得分:1)

您可以优化许多代码:

h2.append($('<input>').attr('type','text'));

build this before the for loop :
var input_html='';
for(var i=0;i<your_number_of_input;i++)
    input_html+='<input type="text">';

或者使用php构建它。 最后不要追加jquery objet,而是直接附加构建的HTML

 konf_cache.find('td').eq(obj_y).append(HTML_VAR_HERE);

尽可能缓存你的jquery选择器(如果可以的话,使用id,而不是class)。

答案 2 :(得分:1)

首先是dzieńdobry, 我认为更容易在匿名函数中执行循环逻辑,因此它不会阻塞线程。

testEmployee(new Employee(13), emp -> emp.isAdult(emp.getAge()));