jQuery DataTables 使用方法整理

https://blog.csdn.net/lovetea99/article/details/52116945

Data sources 数据源

DataTables可以从四种基本形式的数据源获取数据:
HTML document (DOM)
Javascript (array / objects)
Ajax sourced data with client-side processing
Ajax sourced data with server-side processing

1、在html表格数据上应用DateTables

$(document).ready(function() {
$(’#example’).dataTable();
} );

2、ajax数据

$(document).ready(function() {
$(’#example’).dataTable( {
“ajax”: ‘…/ajax/data/arrays.txt’
} );
} );

3、js数据,例子是用一个js数组初始化dt数据

var dataSet = [
[‘Trident’,‘Internet Explorer 4.0’,‘Win 95+’,‘4’,‘X’],
[‘Trident’,‘Internet Explorer 5.0’,‘Win 95+’,‘5’,‘C’],

];

$(document).ready(function() {
    $('#demo').html( '<table cellpadding="0" cellspacing="0" border="0" class="display" id="example"></table>' );
 
    $('#example').dataTable( {
        "data": dataSet,
        "columns": [
            { "title": "Engine" },
            { "title": "Browser" },
            { "title": "Platform" },
            { "title": "Version", "class": "center" },
            { "title": "Grade", "class": "center" }
        ]
    } );   
} );
4、服务器端过程

有很多方法可以把数据装进dataTables里,如果你正在使用一个很庞大的数据库进行工作,你可以考虑使用dataTables提供的服务器端选项,开启服务器端进程后,所有的分页、搜索、排序行为都会被服务器端接手,服务器端的sql引擎(类似这么个意思)就可以在大量数据上进行这些操作(毕竟数据库引擎才是为这项工作而生的)。如此,表格里的每一行会用新的ajax请求来获取它所需的信息。
服务器端过程打开方法:把选项serverSide设为true,然后用ajax选项提交一份ajax数据,例子展示了一个简单的表格,这个例子用的是服务器端过程。更复杂的用法看后面对服务器端过程使用的详细介绍

$(document).ready(function() {
    $('#example').dataTable( {
        "processing": true,
        "serverSide": true,
        "ajax": "../server_side/scripts/server_processing.php"
    } );
} );

API:

1、 Add rows 添加行

新的行可以用 row.add方法,多行数据可以使用rows.add方法,注意想要看到新加的行需要使用draw() 方法,这个方法是dataTables在发生变化时调用的,很容易使用。
下面例子展示了每次单击按钮添加一行的功能。

$(document).ready(function() {
    var t = $('#example').DataTable();
    var counter = 1;
 
    $('#addRow').on( 'click', function () {
        t.row.add( [
            counter +'.1',
            counter +'.2',
            counter +'.3',
            counter +'.4',
            counter +'.5'
        ] ).draw();
 
        counter++;
    } );
 
    // Automatically add a first row of data
    $('#addRow').click();
} );
2、规定搜索功能仅对某一列有效

dt提供的搜索功能很有用,它可以让你迅速搜索表格里的信息,但是它的作用范围是整个表格的所有数据,有时候我们可能只想在某个单独的列使用搜索用能,DataTables提供了这个功能,使用column().search()方法可以指定搜索结果是来自哪一列的。列的搜索是可以相互累加的,你可以进行多列的搜索,给用户提供更多复杂的搜索功能。

$(document).ready(function() {
    // Setup - add a text input to each footer cell
    $('#example tfoot th').each( function () {
        var title = $('#example thead th').eq( $(this).index() ).text();
        $(this).html( '<input type="text" placeholder="Search '+title+'" />' );
    } );
 
    // DataTable
    var table = $('#example').DataTable();
 
    // Apply the search
    table.columns().every( function () {
        var that = this;
        $( 'input', this.footer() ).on( 'keyup change', function () {
            that
                .search( this.value )
                .draw();
        } );
    } );
} );
3、高亮显示列Highlighting rows and columns
$(document).ready(function() {
    var lastIdx = null;
    var table = $('#example').DataTable();
     
    $('#example tbody')
        .on( 'mouseover', 'td', function () {
            var colIdx = table.cell(this).index().column;
 
            if ( colIdx !== lastIdx ) {
                $( table.cells().nodes() ).removeClass( 'highlight' );
                $( table.column( colIdx ).nodes() ).addClass( 'highlight' );
            }
        } )
        .on( 'mouseleave', function () {
            $( table.cells().nodes() ).removeClass( 'highlight' );
        } );
} );
4、给一个行添加下级子行,用于展示额外信息。

点击第一列的加号,官网里面的案例。

function format ( d ) {
    // `d` is the original data object for the row
    return '<table cellpadding="5" cellspacing="0" border="0" style="padding-left:50px;">'+
        '<tr>'+
            '<td>Full name:</td>'+
            '<td>'+d.name+'</td>'+
        '</tr>'+
        '<tr>'+
            '<td>Extension number:</td>'+
            '<td>'+d.extn+'</td>'+
        '</tr>'+
        '<tr>'+
            '<td>Extra info:</td>'+
            '<td>And any further details here (images etc)...</td>'+
        '</tr>'+
    '</table>';
}
 
$(document).ready(function() {
    var table = $('#example').DataTable( {
        "ajax": "../ajax/data/objects.txt",
        "columns": [
            {
                "className":      'details-control',
                "orderable":      false,
                "data":           null,
                "defaultContent": ''
            },
            { "data": "name" },
            { "data": "position" },
            { "data": "office" },
            { "data": "salary" }
        ],
        "order": [[1, 'asc']]
    } );
     
    // Add event listener for opening and closing details
    $('#example tbody').on('click', 'td.details-control', function () {
        var tr = $(this).closest('tr');
        var row = table.row( tr );
 
        if ( row.child.isShown() ) {
            // This row is already open - close it
            row.child.hide();
            tr.removeClass('shown');
        }
        else {
            // Open this row
            row.child( format(row.data()) ).show();
            tr.addClass('shown');
        }
    } );
} );

下面代码是自己创新的,点击某一行直接显示子行,并且点击该行时关闭上述打开的子行。

$('#datatable tbody').on('click', 'tr', function() {
	var data = table.row(this).data();
	var _this = $(this);
	var row = table.row($(this));
	if(_this.hasClass('selected')){
		_this.removeClass('selected');
	}else{
		table.row('.selected').child.hide();
		table.$('tr.selected').removeClass('selected');
		_this.addClass('selected');
	}
	// table.row('.selected').remove().draw(false);
		if (row.child.isShown()) {
		row.child.hide();
		_this.removeClass('shown');
	} else {
		 if(row.child() && row.child().length){
			 row.child.show();
		}else {
			format(data,row);
		}
			_this.addClass('shown');
		}
});
function format(data,row){
	var data = eval( data)
	var weightNo = data.WeightNo
	urlT = baseurl + '?action=getweightv2&weightno=' + weightNo;
	var strTab = '<div class="tableDetail">';
	$.ajax({
		url: urlT,
		type: 'get',
		dataType: 'jsonp',
		success: function(response) {
			var dataTab = response.data;
			for (var i = 0; i < dataTab.length; i++) {
				strTab += "<span class='detailInfo'>" + dataTab[i].title + ":" +
					 '<span style="font-weight: normal">'+dataTab[i].value + "</span></span>";
			}
			strTab += '</div>'
			row.child(strTab).show()
		}
	})
}
5、Row selection (multiple rows) (多)行的选取,

这个有点类似checkbox的功能

rows().data() 通过点击事件添加和移除选中状态。
例子:count选中的行数

$(document).ready(function() {
    var table = $('#example').DataTable();
 
    $('#example tbody').on( 'click', 'tr', function () {
        $(this).toggleClass('selected');
    } );
 
    $('#button').click( function () {
        alert( table.rows('.selected').data().length +' row(s) selected' );
    } );
} );
6、Row selection and deletion (single row) 行的选取,只能选择一行

有点类似 input[type=radio]。上面就应用了该功能

示例展示了一个修改表格内容的例子,每次只有一行可以被选中,它所作的操作是检测当前的目标行,如果已经选中则取消选择,如果没有则取消其他行的选择并选择当前行。使用row().delete()方法删除行,使用draw()方法,它的第一个参数设为false ,这会重新拉取表格数据而保持在当前页不变。(如果没有这个参数,删除数据后分页会跳回第一页)
更多选择行并进行各种操作的复杂的用法看这里http://datatables.net/extensions/tabletools/

$(document).ready(function() {
    var table = $('#example').DataTable();
 
    $('#example tbody').on( 'click', 'tr', function () {
        if ( $(this).hasClass('selected') ) {
            $(this).removeClass('selected');
        }
        else {
            table.$('tr.selected').removeClass('selected');
            $(this).addClass('selected');
        }
    } );
 
    $('#button').click( function () {
        table.row('.selected').remove().draw( false );
    } );
} );
7、Form inputs 表单输入

为了实现分页、排序、搜索等功能,DataTables会将不需要展示的行和单元格从当前DOM移除,这么做提升了性能和兼容性,但是这意味着提交一个跨几个分页点表单会有点问题,需要我们进行一些额外的工作来获取不在当前页面的信息。
DT的 ( ) 方 法 可 以 用 于 获 取 文 档 的 内 容 而 不 用 考 虑 分 页 、 排 序 带 来 的 问 题 。 下 面 例 子 展 示 了 用 ()方法可以用于获取文档的内容而不用考虑分页、排序带来的问题。下面例子展示了用 ()()获取表格中所有输入数据。

$(document).ready(function() {
    var table = $('#example').DataTable();
    $('button').click( function() {
        var data = table.$('input, select').serialize();
        alert(
            "The following data would have been submitted to the server: \n\n"+
            data.substr( 0, 120 )+'...'
        );
        return false;
    } );
} );
8、Index Column 索引列

高交互性的表格经常需要一个‘counter’来标记每一行处的位置,这一行是不支持排序的,并且随着数据的动态变化每个索引对应的行会动态变化。
例子展示了DataTables是如何实现这个功能的,第一列是counter列,并且搜索和排序时会动态更新。这是通过监听表格的order和search事件实现的,当检测到这些事件的发生时,column().nodes()方法被调用用于获取目标列的TH/TD指针,each()方法迭代每一行数据并给他们设置所需的不同内容。
filter和order选项通过当前生效的filter被用于cloumn()方法来获取当前排序的指针。(翻译的有点问题,看原文:http://datatables.net/examples/api/counter_columns.html)

$(document).ready(function() {
    var t = $('#example').DataTable( {
        "columnDefs": [ {
            "searchable": false,
            "orderable": false,
            "targets": 0
        } ],
        "order": [[ 1, 'asc' ]]
    } );
 
    t.on( 'order.dt search.dt', function () {
        t.column(0, {search:'applied', order:'applied'}).nodes().each( function (cell, i) {
            cell.innerHTML = i+1;
        } );
    } ).draw();
} );
9、动态显示和隐藏行 Show / hide columns dynamically

例子展示了怎么使用column().visible()方法去动态显示和隐藏一个列。这个例子还设置了滚动,只是为了展示滚动在这里被支持,但它并不是必须的。
另外,几个列可以同时被隐藏和显示,只需使用columns()方法选中多列,再用columns().visible()方法设置可见性状态。

If you are looking for a more complete column visibility interaction controls ColVis for DataTables provides a complete interface for allowing the user to show and hide columns in the table.

如果你需要更加详细的列显示状态交互,DataTables的ColVis (http://datatables.net/extensions/colvis/)提供了一些完整的接口来控制列的显示和隐藏。

$(document).ready(function() {
    var table = $('#example').DataTable( {
        "scrollY": "200px",
        "paging": false
    } );
 
    $('a.toggle-vis').on( 'click', function (e) {
        e.preventDefault();
 
        // Get the column API object
        var column = table.column( $(this).attr('data-column') );
 
        // Toggle the visibility
        column.visible( ! column.visible() );
    } );
} );
10、Using API in callbacks 在回调方法中使用api

有时候你也许需要在dt回调方法(例如:initComplete, roeCallback 等)里面使用api,但是这有一个问题就是对象并没有完全初始化完,所以你无法把结果赋给一个值并在回调里面使用,但是,所有的dt回调是在dt实例里面完成的,所以你可以使用javascript的特殊变量this来获取,this.api() 会获取一个指向表格的api实例。
在这个例子中,$() 方法被用来获取表格中所有的单元格指针,然后给他们添加了一些行为(例子中是一个点击事件),在这边所做的是给表格加了一个filter(搜索),每次点击每个单元格,里面的值会被用作搜索框里的参数过滤数据。其实这也并没有什么,我们可以在在表格加载完毕时给它添加一个delegate事件来实现同样的功能,这里只是为了展示如何在callback里面使用api;

$(document).ready(function() {
    $('#example').dataTable( {
        "initComplete": function () {
            var api = this.api();
            api.$('td').click( function () {
                api.search( this.innerHTML ).draw();
            } );
        }
    } );
} );

Ajax

1、从嵌套的json数据获取表格数据列
$(document).ready(function() {
    $('#example').dataTable( {
        "processing": true,
        "ajax": "data/objects_deep.txt",
       	"columns": [{
					data: "",
				},
				{
					data: "WeightTime",
					className: "center",
					render: function(data, type, row) {
						return moment(data).format("YYYY-MM-DD<br/>HH:mm");
					},
				},
				{
					data: "Weight",
					className: "number",
					render: function(data, type, row) {
						return (data / 1000).toFixed(2)
					},
				},
			],
    } );
} );
2、对某一列内容过长折叠显示
var remarkShowLength = 9; //默认现实的字符串长度
 $('#example').dataTable {
        "processing": true,
        "ajax": "data/objects_deep.txt",
       	"columns": [
       		{
				data: "WzMC",
				className: "center",
				render: function(data, type, row) {
					var wzmclength = row.WzMC.length + row.WzGGXH.length + 1;
					if (wzmclength > remarkShowLength) {
						return getPartialRemarksHtml(row.WzMC + " " + row.WzGGXH); //显示部分信息
					} else {
						return row.WzMC + " " + row.WzGGXH; //显示原始全部信息 }
					}
				}
			},
		],
		"createdRow": function(row, data, dataIndex) {
			var wzmcLength = data.WzMC.length + data.WzGGXH.length + 1;
			if (wzmcLength > remarkShowLength) {
				$(row).children('td').eq(6).attr('onclick', 'javascript:changeShowRemarks(this);');
			}
			$(row).children('td').eq(5).attr('content', data.DFMC);
			$(row).children('td').eq(9).attr('content', data.Note);
			$(row).children('td').eq(6).attr('content', data.WzMC + " " + data.WzGGXH);
		},
    });

function changeShowRemarks(obj) { //obj是td
	var content = $(obj).attr("content");
	if (content != null && content != '') {
		if ($(obj).attr("isDetail") == 'true') { //当前显示的是详细备注,切换到显示部分
			//$(obj).removeAttr('isDetail');//remove也可以
			$(obj).attr('isDetail', false);
			$(obj).html(getPartialRemarksHtml(content));
		} else { //当前显示的是部分备注信息,切换到显示全部
			$(obj).attr('isDetail', true);
			$(obj).html(getTotalRemarksHtml(content));
		}
	}
}

//部分备注信息
function getPartialRemarksHtml(remarks) {
	return remarks.substr(0, remarkShowLength) + '&nbsp;&nbsp;<a href="javascript:void(0);" ><b>...</b></a>';
}

//全部备注信息
function getTotalRemarksHtml(remarks) {
	return remarks + '&nbsp;&nbsp;<a href="javascript:void(0);" >收起</a>';
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值