2015-04-12 96 views
0

我有一个包含了年,月,国家和城市组合框数据过滤器。所有组合框的项目有一个选择所有(所有年份,所有月份,所有国家和所有城市)。处理大量数据的jQuery

当我选择一个过滤器,我将数据发送到服务器和我得到的数据JSON对象,这是由JQuery的处理。

的问题就来了,如果你选择的所有数据 - 服务器将返回一个JSON对象有三万记录(及以上)和浏览器,包括动画演出(装载机),冻结和一切花费的时间太长。

这是数据过滤器的HTML(有些选择是通过AJAX填写)

<div class="panel panel-default"> 
    <div class="panel-heading"> 
     <h3 class="panel-title" data-label="Filter data"></h3> 
    </div> 
    <div class="panel-body"> 
     <div class="row"> 
      <div class="col-md-3" data-label="Year"></div> 
      <div class="col-md-3" data-label="Month"></div> 
      <div class="col-md-3" data-label="Country"></div> 
      <div class="col-md-3" data-label="City"></div> 
     </div> 

     <div class="row"> 
      <div class="col-md-3"> 
       <select id="cmbYear"> 
        <option value="0" data-label="All years"></option> 
       </select> 
      </div> 
      <div class="col-md-3"> 
       <select id="cmbMonth"> 
        <option value="0" data-label="All year"></option> 
        <option value="1" data-label="January"></option> 
        <option value="2" data-label="February"></option> 
        <option value="3" data-label="March"></option> 
        <option value="4" data-label="April"></option> 
        <option value="5" data-label="May"></option> 
        <option value="6" data-label="June"></option> 
        <option value="7" data-label="July"></option> 
        <option value="8" data-label="August"></option> 
        <option value="9" data-label="September"></option> 
        <option value="10" data-label="October"></option> 
        <option value="11" data-label="November"></option> 
        <option value="12" data-label="December"></option> 
       </select> 
      </div> 
      <div class="col-md-3"> 
       <select id="cmbCountry"> 
    <option value="0" data-label="All countries"></option> 
      </select> 
     </div> 
     <div class="col-md-3"> 
      <select id="cmbCity"> 
       <option value="0" data-label="All cities"></option> 
      </select> 
     </div> 
    </div> 
    <br/> 
    <div class="row"> 
     <div class="col-md-12"> 
      <button id="btnFilterData" data-label="Filter data" class="btn btn-primary btn-lg pull-right"></button> 
     </div> 
    </div> 
</div> 

这是一个jQuery脚本:

$(document).ready(function() { 
    $('#btnFilterData').click(function() { 
     GetFilteredData(); 
    }); 
}); 

function GetFilteredData() { 
    $.ajax({ 
     url: 'some-file.php', 
     data: { 
      year: $('#cmbYear').val(), 
      month: $('#cmbMonth').val(), 
      countryid: $('#cmbCountry').val(), 
      cityid: $('#cmbCity').val() 
     }, 
     type: 'post', 
     async: true, 
     success: function (data) { 
      if (data.IsError) { 
       ShowErrorDialog(data.Error); 
      } 
      else { 
       $('#tableRawData').find('tr:gt(0)').remove(); 
       if (data.Data != null) { 


      for (var i = 0; i < Object.keys(data.Data).length; i++) { 
        var obj = data.Data[i]; 

        var newRow = '<tr><td>' + obj.Date+ '</td><td>' + obj.Country + '</td><td>' + obj.City + '</td><td>' + obj.Loan+ '</td><td>' + obj.Paid+ '</td><td>' + obj.Remains+ '</td><td data-label="' + obj.Note + '"></td></tr>'; 
        $('#tableRawData').append(newRow); 
       } 
      } 
     } 
    }, 
    complete: function() { 
     HideWaitDialog(); 
    } 
}); 

什么办法如何使处理更快还是更有效?在理想的情况下,不冻结浏览器和动画加载器...

+3

也许在结果中添加分页,以便一次只显示几个分页?我怀疑任何用户将需要*同时*看到30,000条记录。 – David

+0

足够容易设置某种限制,并且如果存在比限制返回消息更多的结果,告诉用户缩小过滤器 – charlietfl

+0

实际上不需要显示所有记录。这只是外部的限制:-)但我的客户希望有可能显示所有数据(我的意思是这是不正确的解决方案,但他想要它) – Davecz

回答

2

我读过你的代码,我同意分页上的评论,但是,如果你真的想保持这些东西,他们在这里的方式是一些优化我找到

  • 您在每次迭代时都调用$('#tableRawData'),但这在每次迭代时都会相同。你在这里浪费计算能力。你应该在循环开始时将它放入一个变量中。通过这样做,你将提高你的代码的性能15%
  • append是一个涉及DOM操作的复杂函数,你不应该尽可能少地使用它。一个小窍门是积累你的HTML中的字符串,并呼吁追加在循环的结束。通过这样做,你将会是快12倍比我以前的解决方案
  • jQuery附加解析你的字符串并分解它做DOM元素并将它们附加到DOM树。这种操作成本很高。你可以做的是作为浏览器来解析字符串并追加它。这将是更快,因为它是天然的和高度优化的代码,并会有的jQuery,JavaScript和DOM树之间没有相互作用。如果你这样做会比我以前的解决方案快1.7倍

我把代码片段在jsperf这样你就可以在你的操作系统和浏览器上测试它:http://jsperf.com/creating-a-large-table-with-jquery

所有测试为10000行。

应用在我的浏览器的所有优化使代码26X快比你

作为一个有趣的结论:在回答你的问题:

处理大量数据的jQuery

是:

不要使用jQuery;)