DataTables - 完整列編輯範例

前言

此範例展示如何使用 DataTables 實現完整列編輯,且可以方便地進行自定義。請參閱描述此範例的部落格文章以獲取更多資訊。

線上範例

新增列

渲染引擎 瀏覽器 平台 引擎版本 CSS 等級 編輯 刪除
Trident Internet Explorer 4.0 Win 95+ 4 X 編輯 刪除
Trident Internet Explorer 5.0 Win 95+ 5 C 編輯 刪除
Trident Internet Explorer 5.5 Win 95+ 5.5 A 編輯 刪除

初始化程式碼

function restoreRow ( oTable, nRow )
{
	var aData = oTable.fnGetData(nRow);
	var jqTds = $('>td', nRow);
	
	for ( var i=0, iLen=jqTds.length ; i<iLen ; i++ ) {
		oTable.fnUpdate( aData[i], nRow, i, false );
	}
	
	oTable.fnDraw();
}

function editRow ( oTable, nRow )
{
	var aData = oTable.fnGetData(nRow);
	var jqTds = $('>td', nRow);
	jqTds[0].innerHTML = '<input type="text" value="'+aData[0]+'">';
	jqTds[1].innerHTML = '<input type="text" value="'+aData[1]+'">';
	jqTds[2].innerHTML = '<input type="text" value="'+aData[2]+'">';
	jqTds[3].innerHTML = '<input type="text" value="'+aData[3]+'">';
	jqTds[4].innerHTML = '<input type="text" value="'+aData[4]+'">';
	jqTds[5].innerHTML = '<a class="edit" href="">Save</a>';
}

function saveRow ( oTable, nRow )
{
	var jqInputs = $('input', nRow);
	oTable.fnUpdate( jqInputs[0].value, nRow, 0, false );
	oTable.fnUpdate( jqInputs[1].value, nRow, 1, false );
	oTable.fnUpdate( jqInputs[2].value, nRow, 2, false );
	oTable.fnUpdate( jqInputs[3].value, nRow, 3, false );
	oTable.fnUpdate( jqInputs[4].value, nRow, 4, false );
	oTable.fnUpdate( '<a class="edit" href="">Edit</a>', nRow, 5, false );
	oTable.fnDraw();
}

$(document).ready(function() {
	var oTable = $('#example').dataTable();
	var nEditing = null;
	
	$('#new').click( function (e) {
		e.preventDefault();
		
		var aiNew = oTable.fnAddData( [ '', '', '', '', '', 
			'<a class="edit" href="">Edit</a>', '<a class="delete" href="">Delete</a>' ] );
		var nRow = oTable.fnGetNodes( aiNew[0] );
		editRow( oTable, nRow );
		nEditing = nRow;
	} );
	
	$('#example a.delete').live('click', function (e) {
		e.preventDefault();
		
		var nRow = $(this).parents('tr')[0];
		oTable.fnDeleteRow( nRow );
	} );
	
	$('#example a.edit').live('click', function (e) {
		e.preventDefault();
		
		/* Get the row as a parent of the link that was clicked on */
		var nRow = $(this).parents('tr')[0];
		
		if ( nEditing !== null && nEditing != nRow ) {
			/* Currently editing - but not this row - restore the old before continuing to edit mode */
			restoreRow( oTable, nEditing );
			editRow( oTable, nRow );
			nEditing = nRow;
		}
		else if ( nEditing == nRow && this.innerHTML == "Save" ) {
			/* Editing this row and want to save it */
			saveRow( oTable, nEditing );
			nEditing = null;
		}
		else {
			/* No edit in progress - let's start one */
			editRow( oTable, nRow );
			nEditing = nRow;
		}
	} );
} );