zoukankan      html  css  js  c++  java
  • JQuery Datatable Ajax请求两次问题的解决

    最近一个项目中使用JQuery Datatable,用起来比较方便,但在测试过程中,发现当条件改变时,有时查询结果中的数据不正确。

    使用FireBug跟踪时,发现在使用Ajax请求时,点击一次搜索按钮,却发送了两次请求,一次是原条件的请求,一次是新的请求。

    下面是查询按钮的代码。先判断是否是Datatable,如果是的话,先Destroy掉,再重新创建。

    function search(data) {
    	var $searchResult = $("#search-result .result-panel");
    	
         if (resultDataTable) {
        	resultDataTable.fnClearTable();
        	$searchResult.dataTable().fnDestroy();
        	$("#resultList").empty();
        }  else {
        	$searchResult.show();
        }
        resultDataTable = $searchResult.dataTable({
    		"bPaginate" : true,
    		"bAutoWidth" : false,
    		"bProcessing": true,
    		"bFilter": false,
    		"bJQueryUI": true,     
    		"sPaginationType": "full_numbers",
            "oLanguage": {                          //汉化
                "sLengthMenu": "每页显示 _MENU_ 条记录",
                "sZeroRecords": "没有检索到数据",
                "sInfo": "当前数据为从第 _START_ 到第 _END_ 条数据;总共有 _TOTAL_ 条记录",
                "sInfoEmtpy": "没有数据",
                "sProcessing": "正在加载数据...",
                "oPaginate": {
                    "sFirst": "首页",
                    "sPrevious": "前页",
                    "sNext": "后页",
                    "sLast": "尾页"
                }
            }, 
            "bServerSide": true,
            "sServerMethod": "POST",
            "sAjaxSource": "${baseUrl}/zpzxResumeSearch.do?&method=<bean:message key='zjzxResume.button.search' />",
            //"fnServerData": executeQuery,
            "fnServerParams": function (aoData) {
                aoData.push({"name": "conds", "value": data});
            },
            "aoColumns": [
                { "mData": null },
                { "mData": "name" },
                { "mData": "sex" },
                { "mData": "birthday" },
                { "mData": "mobilePhone" },
                { "mData": "diploma" },
                { "mData": "workYears" },
                { "mData": "currentAddress" },
                { "mData": "hukouAddress" },
                { "mData": "updateTime" },
                { "mData": null }
            ],
            "aoColumnDefs": [
                 {
    	            "aTargets": [ 1 ],
    	            "mRender": function ( data, type, full ) {
    		        	    return "<a target='_blank' onmouseover='showLabels(this, event);' onmouseout='hiddenLabels(this, event);' labels='"+buildResumeLabels(full)+"'  href='${baseUrl}/zpzxResumeLookResult.do?resumeId="
    		        	    		+full.resumeId+"&zpzxTalentId="
    		        	    		+full.zpzxTalentId+"&method=<bean:message key='zjzxResume.button.showDetailInfo' />'>"
    		        	    		+ data + "</a>";	        
    	            }
              },
              {
            	  "aTargets": [ 0 ],
            	  "mRender": function ( data, type, full ) {
    	        	    return "<input type='checkbox' value='"+full.resumeId+"' class='chkExportResume' />";
            	  }
              },
              {        	 
            	  "aTargets": [ 10 ],
            	  "mRender": function ( data, type, full ) {
    	        	    return buildLink(data, type, full);
            	  }
              }
            ]
        });

    跟踪Datatable后发现,在执行

    resultDataTable.fnClearTable();

    方法时,实际调用了一次fnDraw方法,该方法会调用Ajax请求,然后在DataTable的_fnInitialise方法中会再调用一次Ajax请求。

    查看Datatable发现fnClearTable方法实际上还有一个布尔值参数来控制是否执行fnDraw方法,即只要把该语句修改为

    resultDataTable.fnClearTable(false);

    一切就OK了。

    调查该问题Google了很久,最后还是通过看源码解决。不过,由此也看到Datatable作者在写此插件时,使用了很多优秀的编程方法,使得此插件很容易使用和扩展。感谢他们的贡献!

  • 相关阅读:
    第16次作业
    第15次作业
    第14次作业
    第13次作业
    第12次作业
    第11次作业
    第十次作业
    第九次作业
    第八次作业
    滚动视图练习
  • 原文地址:https://www.cnblogs.com/riasky/p/3455178.html
Copyright © 2011-2022 走看看