`

关于Jquery的DataTables里TableTools的应用

阅读更多
关于Jquery的DataTables里TableTools的应用
分类: javaScript 2011-06-24 17:45 880人阅读 评论(0) 收藏 举报


最近在产品中使用了TableTools这个工具,主要用来实现导出和复制功能。

但是在实际的运用中出现了以下相关问题

当结合jquery的tabs工具,tableTools只能在初始化的页面运行正常,一旦切换到其他Tabs里就不能正常运行了;

另外就是同一个页面里,不能在不同的div下创建一个tableTools工具;

还有就是几个datatables在一个页面里,但是每次都只显示其中一个,导致TableTools工具不能正常使用。

而且datatables在多次切换后,还会出现有时也会报__flash__addCallback相关的错误,function __flash__addCallback(instance, name) 方法里的instance为null。

另外同时初始化多个datatables组件,当前页面只显示一个,另外一个需要通过切换的方式进行显示(tabs),但表头会缩进。

TableTools默认都是前台导出哦复制,如何实现后台导出(并支持后台过滤)。



1、datatables表头缩短问题,首先是这个div必须显示出来,不能让此div在一个display:none的状态下,如果这样,datatables更新数据后显示就会出现表头缩短。

2、多个tables在同一页面下,必须在一个大的容器里面(简单的说就是在一个div下面),不然tableTools导出不能使用。

3、关于tablesTools后台分页处理,这里给出源码(实际情况需要调试):

  1.增加aButton项

"ext-xls": { "sAction": "flash_save",
  "sCharSet": "utf16le",
  "bBomInc": true,
  "sFileName": "*.csv",
  "sFieldBoundary": "",
  "sFieldSeperator": "\t",
  "sNewLine": "auto",
  "sTitle": "",
  "sToolTip": "",
  "sButtonClass": "DTTT_button_xls",
  "sButtonClassHover": "DTTT_button_xls_hover",
  "sButtonText": "Excel",
  "sAjaxUrl": "/xhr.php",
  "sParameters":"",
  "sKeys":"",
  "mColumns": "all",
  "bHeader": true,
  "bFooter": true,
  "bSelectedOnly": false,
  "fnMouseover": null,
  "fnMouseout": null,
  "fnClick": function( nButton, oConfig , flash) {
   var sData = this.fnGetExtXlsData(oConfig, "header");
   var vkeys = oConfig.sKeys;
   $.ajax( {
    "url": oConfig.sAjaxUrl,
    "data": oConfig.sParameters,
    "async": false,
    "success": function(data) {
     $.each(data.jsondata, function(k, n){
      sData += (k+1) + "\t";
      for(j =0; j<vkeys.length ; j ++) {
       sData += " " + eval("n[\"" + vkeys[j] + "\"]") + "\t";
      }
      sData += "\r\n";
     });
    },
    "dataType": "json",
    "type": "POST"
   } );
   sData += this.fnGetExtXlsData(oConfig, "footer");
   this.fnSetText(flash, sData);
  },
  "fnSelect": null,
  "fnComplete": null,
  "fnInit": null,
  "fnAjaxComplete": null
},
此处是通过分析tabletools导出数据格式后进行修改的,只是加上了ajax后返回数据的填充,其他导出的header、footer都是于页面上保持一致。

@@另外java端设置json的名字应该为jsondata(必须一致)

fnGetExtXlsData方法

/** @method fnGetExtXlsData
  * @param oConfig
  * @returns
  */
"fnGetExtXlsData": function ( oConfig , flag)
{
  /* In future this could be used to get data from a plain HTML source as well as DataTables */
  if ( this.s.dt )
  {
   return this._fnGetExtXlsData( oConfig , flag);
  }
},
_fnGetExtXlsData方法

/**
  * @param oConfig
  * @param data
  * @returns {String}
  */
"_fnGetExtXlsData": function ( oConfig , flag)
{
  var i, iLen, j, jLen;
  var sData = '', sLoopData = '';
  var dt = this.s.dt;
  var regex = new RegExp(oConfig.sFieldBoundary, "g"); /* Do it here for speed */
  var aColumnsInc = this._fnColumnTargets( oConfig.mColumns );
  var sNewline = this._fnNewline( oConfig );

  /*
   * Header
   */
  if ( oConfig.bHeader && flag == "header")
  {
   for ( i=0, iLen=dt.aoColumns.length ; i<iLen ; i++ )
   {
    if ( aColumnsInc[i] )
    {
     sLoopData = dt.aoColumns[i].sTitle.replace(/\n/g," ").replace( /<.*?>/g, "" );
     sLoopData = this._fnHtmlDecode( sLoopData );

     sData += this._fnBoundData( sLoopData, oConfig.sFieldBoundary, regex ) +
       oConfig.sFieldSeperator;
    }
   }
   sData = sData.slice( 0, oConfig.sFieldSeperator.length*-1 );
   sData += sNewline;
  }

  /*
   * Footer
   */
  if ( oConfig.bFooter && flag == "footer")
  {
   for ( i=0, iLen=dt.aoColumns.length ; i<iLen ; i++ )
   {
    if ( aColumnsInc[i] && dt.aoColumns[i].nTf !== null )
    {
     sLoopData = dt.aoColumns[i].nTf.innerHTML.replace(/\n/g," ").replace( /<.*?>/g, "" );
     sLoopData = this._fnHtmlDecode( sLoopData );

     sData += this._fnBoundData( sLoopData, oConfig.sFieldBoundary, regex ) +
       oConfig.sFieldSeperator;
    }
   }
   sData = sData.slice( 0, oConfig.sFieldSeperator.length*-1 );
  }

  /* No pointers here - this is a string copy   */
  //_sLastData = sData;
  return sData;
},
以上该方法只是借用插件原先实现的方式设置header与footer。

到此处应该说tabletools的源码改造部分完成,下面该是前端如何应用了,请继续往瞎看(硬着头皮也要继续 (*^__^*) 嘻嘻……)

【页面应用实例】

function fillData2Tables(arr) {

  if (dateTable != null) {dateTable.fnClearTable();}
  var queryType = getQuertTypeValue();
  var parameters = {"queryType":queryType,
    "startDate":$("#startDate").val(),
    "endDate":$("#endDate").val(),
    "singleDate":$("#singleDate").val(),
    "userid":$("#userid").val(),
    "userlevel":$("#userlevel").val()};

  var vKeys = ["nick", "logintimes", "userid", "usertype", "userlevel", "shopid", "shoptitle", "shopcname", "ddate"];
  dateTable = $('#loginUser').dataTable( {
   "sDom": 'T<"clear">lfrtip',
   "oTableTools": {
    "sSwfPath": "../3rd/datatables/media/TableTools/media/swf/copy_cvs_xls_pdf.swf",
    "aButtons": [
     {
      "sExtends": "copy",
      "sButtonText": "复制"
     },
     {
      "sExtends": "xls",
      "sButtonText": "导出Excel"
     },
     {
      "sExtends": "ext-xls",
      "sAjaxUrl": "yx/loginUser!ext.action",
      "sParameters": parameters,
      "sKeys": vKeys,
      "sButtonText": "导出文件"
     }
    ]
   },
     'sScrollX': '100%',
     'sScrollXInner': '180%',
     "sPaginationType": "full_numbers",
     'bScrollCollapse': true,
     'fnDrawCallback': function ( oSettings ) {
      if ( oSettings.bSorted || oSettings.bFiltered ) {
       for ( var i=0, iLen=oSettings.aiDisplay.length ; i<iLen ; i++ ) {
        $('td:eq(0)', oSettings.aoData[ oSettings.aiDisplay[i] ].nTr ).html( i+1 );
       }
      }
     },
     'aoColumnDefs': [
      { 'bSortable': false, 'sClass': 'index', 'aTargets': [ 0 ] }
     ],
     'aaSorting': [[1,'desc']]
    } );
  dateTable.fnAddData(arr);
}

java端实现:
public String ext() throws Exception {
  QueryCondition qc = wrapQueryCondition();
  qc.setIsDownload(AppCons.ISDOWNLOAD);
  List<DayLogin> dayLogins = fxbReportService.getDayLoginsByCondition(qc);
  Map<String,Object> map = new HashMap<String, Object>();
  map.put("jsondata", dayLogins);

  Struts2Utils.renderJson(JSONObject.fromObject(map).toString());
  return null;
}

以上红色部分,需要说明的是:

sAjaxUrl:请求的url地址

sParameters:请求的参数

sKeys:对应的json数据的key值,必须与页面table列一致(数量)

sExtends:此处是扩展tabletools的一个aButton项



4、在使用datatable结合tableTools时,最好该对象能够重用,而不是每次都创建新的,这样可以避免出现flash崩溃的情况,另一种方式就是多次创建也可以,不过要进行清除处理,也能避免flash崩溃情况。清理代码如下:

if($('#ZeroClipboardMovie_'+count)!=null){
   $('#ZeroClipboardMovie_'+count).remove();
  }

count++;

count是每次创建时,都会自动加1,这样才能匹配找到对应的对象。



5、当使用tabs结合datatable时,必须有一个主框架,简单说就是tabs里有四个选项,每个选项对应一个页面。总共就需要5个页面,其中一个页面就是用来包含其他4个页面,包括加载其他的js、css等(也许说的不是很明白,表达不够准确吧,呵呵)。



过段时间会整理关于fusioncharts的使用方式,其类似的问题也在datatable里出现过。
分享到:
评论
1 楼 粗心小意 2015-08-21  
您好,我最近正好遇到了tabs结合datatable的问题,弄了好久都没有解决,网上也没有查到其他相关资料,您能不能更详细地解释一下?非常感谢,期待得到您的回复!我的邮箱是493913585@qq.com

相关推荐

    dataTables.tableTools1.9.3.min.js

    dataTables.tableTools.1.9.3.min.js Jquery插件DataTables中的TableTools导出csv和PDF

    前端项目-datatables-tabletools.zip

    1. **安装**:首先确保引入了DataTables和jQuery库,然后引入Tabletools的CSS和JS文件。 2. **初始化**:在DataTables的初始化选项中,通过`tableTools`参数启用Tabletools,并设置所需的配置项,如按钮列表和样式。...

    开发工具 jquery.dataTables.min

    开发工具 jquery.dataTables.min开发工具 jquery.dataTables.min开发工具 jquery.dataTables.min开发工具 jquery.dataTables.min开发工具 jquery.dataTables.min开发工具 jquery.dataTables.min开发工具 jquery....

    jquery datatables 所需文件 官方下载的

    **jQuery DataTables 知识点详解** `jQuery DataTables` 是一个强大且功能丰富的JavaScript库,用于将HTML表格转化为交互式的数据展示工具。这个库基于jQuery框架,提供了数据排序、搜索、分页以及多种自定义功能,...

    jquery dataTables及相关css

    在实际应用中,使用jQuery DataTables通常涉及以下步骤: 1. 引入jQuery和DataTables库:确保在HTML文件中正确引入jQuery和DataTables的JavaScript文件,以及对应的CSS文件。 2. 初始化DataTable:通过JavaScript...

    JQuery DataTables示例,包含分页、拖拽、导出

    **jQuery DataTables 深入理解与应用** jQuery DataTables 是一个强大且功能丰富的JavaScript库,用于增强HTML表格。它提供了各种高级特性,如分页、排序、过滤、搜索、数据加载以及更多,大大提升了用户体验。在这...

    DONET的JQuery.Datatables集成插件(Mvc.JQuery.Datatables)

    通过学习和使用`Mvc.JQuery.Datatables`,开发者不仅可以快速地在.NET MVC应用中实现复杂的数据表格功能,还能借此机会深入理解前端和后端交互的工作原理,提升Web开发技能。在实际开发中,可以根据项目需求自定义...

    jquery dataTables组件

    **jQuery DataTables组件详解** jQuery DataTables是一款强大的数据表格插件,它允许开发者轻松地将HTML表格转化为功能丰富的数据展示工具。这个组件以其强大的搜索、排序、分页和过滤功能而受到广泛欢迎,尤其适用...

    jquery.dataTables包.rar

    《jQuery DataTables插件详解与应用》 jQuery DataTables 是一款功能强大的JavaScript表格插件,它基于jQuery库,能够将HTML表格转化为具有高级特性的数据展示工具,如排序、搜索、分页等。"jquery.dataTables包....

    jQuery datatables插件

    **jQuery DataTables 插件详解** jQuery DataTables 是一个强大且功能丰富的JavaScript库,用于将HTML表格转化为交互式数据展示工具。它支持多种高级功能,包括数据排序、列过滤、隐藏列以及更多自定义选项,使得...

    datatables-tabletools:http 的 Shim 存储库

    datatables-tabletools Shim 存储库 包管理器 : drmonty-datatables-tabletools : drmonty-datatables-tabletools : drmonty/datatables-tabletools : drmonty/datatables-tabletools

    jQuery Datatables.zip

    **一、jQuery DataTables的主要特性** 1. **数据排序**:Datatables允许用户通过点击表头对数据进行升序或降序排序,支持多列同时排序。 2. **快速搜索**:内置的搜索功能可以在整个表格中快速查找特定数据,提高...

    jquery DataTables-1.9.4

    总的来说,`jQuery DataTables 1.9.4`是一个强大且易用的表格插件,适用于各种数据展示需求,无论是简单的数据列表还是复杂的数据管理应用,都能得心应手。通过其丰富的功能和良好的扩展性,可以极大地提高开发效率...

    jquery.dataTables.min.js

    jquery.dataTables.min.js是使用Datatable插件时用的脚本文件

    Jquery dataTables插件

    1. **jQuery DataTables基本介绍** jQuery DataTables是一款基于jQuery库的开源插件,它能够将普通的HTML表格转化为功能丰富的交互式数据展示平台。通过使用DataTables,开发者可以轻松地实现数据的排序、搜索、...

    Datatables jquery表格插件

    Datatables是一款基于jQuery的开源表格插件,广泛应用于网页数据展示和管理。它以其丰富的功能、高度的灵活性和良好的社区支持而备受青睐。这个插件的主要目标是将静态或者动态生成的HTML表格转变为具有强大交互性的...

    jquery datatables实例

    在这个"jquery datatables前后台数据交互分页实例"中,我们将探讨如何在实际项目中运用jQuery DataTables与后台进行数据交互,实现动态分页。 首先,我们需要在HTML页面中引入jQuery DataTables库。通常,这包括...

    jquery-dataTables简单实例

    **jQuery DataTables 简单实例** jQuery DataTables 是一个高度可配置的表格插件,它为HTML表格提供了丰富的功能,如排序、过滤、分页和数据导出等。在这个实例中,我们将深入理解如何使用jQuery DataTables创建...

    Spring Boot+MybatisPlus使用JQuery DataTables表格插件展示数据、实现分页和模糊查询等功能

    通过以上知识点的讲解,我们可以看到Spring Boot、MybatisPlus和JQuery DataTables的结合使用,可以高效地实现数据展示、分页和模糊查询功能,是现代企业级Web应用中的常见实践。在实际开发中,还需要根据具体需求...

Global site tag (gtag.js) - Google Analytics