内存泄漏时会发生更改事件,每次加载新的JQuery插件DataTables时都会加载

时间:2014-03-26 16:17:22

标签: c# javascript jquery memory-leaks datatables

我遇到内存泄漏问题。

我在Html页面中显示一个表格(DataTables plugin),其中包含一个包含事件change()的选择标记( Select2 )。

我注意到任务管理器(IE或FireFox)发生了一些内存泄漏。

我的代码运行良好,唯一的问题是内存泄漏。

这是我的Html代码,我有2个表,当我点击第一个表的一行( table_statistic_10 )时会显示第二个( table_statistic_10_ligne ),它显示此行的详细信息:

<body>
 <select id="Select2" name="D1" style="margin-right :50px">
 </select>
 <script>
    $("#Select2").change(function () { selectStat10(Select2.options[Select2.selectedIndex].value) });
 </script>

 <table id="table_statistic_10" class="display">
    <caption class="caption">Detail van verkopen</caption>
    <thead>
    </thead>
    <tbody>
    </tbody>
 </table>
  <br />
  <br />

 <table id="table_statistic_10_ligne" class="display">
    <thead>
    </thead>
    <tbody>
    </tbody>
 </table>
 <script type="text/javascript">
    fillSlectTagStat10();
 </script>
</body>

这是我的javascript代码,在成功的过程中,我检索了值(从C#中的Web服务中检索到)并将其填入数据表中:

function getStatistic10(dstart, dend, nam) {

var response;
var allstat10 = [];

if (typeof myTabLigne10 != 'undefined') {
    myTabLigne10.fnClearTable();
}
    $.ajax({
        type: 'GET',
        url: 'http://localhost:52251/Service1.asmx/Statistic_10_Entete',
        data: { "start": JSON.stringify(dstart), "end": JSON.stringify(dend), "name": JSON.stringify(nam) },
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        success: function (msg) {
            response = msg.d;
            for (var i = 0; i < response.Items.length; i++) {
                var j = 0;
                allstat10[i] = [response.Items[i].Nom, response.Items[i].Date, response.Items[i].Piece, response.Items[i].Tiers, number_format(response.Items[i].AmoutHT, 2, ',', ' '), number_format(response.Items[i].AmountTTC, 2, ',', ' '), response.Items[i].Quantite];
            }
            if (typeof myTabEntete10 != 'undefined') {
                myTabEntete10.fnClearTable();
            }
            fillDataTableEntete10(allstat10, dstart, dend);

        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            alert("error loading statistic 10");
            alert("Status: " + textStatus + "\n" + "Error: " + errorThrown);
        }
    });
}

填写dataTables代码:

function fillDataTableEntete10(data, dstart, dend) {

if ($("#table_statistic_10").css("visibility") == "hidden")
    $("#table_statistic_10").css("visibility", "visible");

myTabEntete10 = $('#table_statistic_10').dataTable({

    'aaData': data,
    'aoColumns': [
        { "sTitle": "Nom" },
        { "sTitle": "Date" },
        { "sTitle": "Piece" },
        { "sTitle": "Tiers" },
        { "sTitle": "AmoutHT" },
        { "sTitle": "AmountTTC" },
        { "sTitle": "Quantite" }
    ],

    "sPaginationType": "full_numbers",
    "iDisplayLength": 10,
    "bJQueryUI": true,
    "bDestroy": true,
    "bPaginate": true,
    "bLengthChange": false,
    "bFilter": true,
    "bSort": false,
    "bInfo": false,
    "bAutoWidth": false,
    "sDom": '<"top"f<"clear">>rt<"bottom"ilp<"clear">>'


});

我在select标签中有大约10个值(customer)( Select2 )。但是一个客户有大约20,000行我填写数据表。当我多次选择这个客户时,我发现内存增加了。

我使用fnClearTable()但它不起作用。

你有一个想法因为我有点失落吗?

编辑:我解决了这个问题,我用fnClearTable()和fnAddData()更新了DataTables。但现在,问题在于我的点击事件,因为这段代码我有内存泄漏:

                myTabEntete10.$('tr').bind('click',function () {
                var data = myTabEntete10.fnGetData(this);
                $('tr').removeClass('row_selected');
                $(this).addClass('row_selected');
                loadData10(dstart, dend, data[2], data[3]);
                delete data;
            });

为什么?

1 个答案:

答案 0 :(得分:0)

我解决了这个问题。

我替换现有的DataTable。

if (typeof myTabEntete10 != 'undefined') {
   $('body').off("click", '#table_statistic_10 tbody tr');
   myTabEntete10.fnClearTable();
   myTabEntete10.fnAddData(allstat10);

} else {
   fillDataTableEntete10(allstat10, dstart, dend);
}

我使用DataTables的bDeferRender选项,请参阅here