From 4812d1d35b78ca44c67d2cd7aabf514319e04ccb Mon Sep 17 00:00:00 2001 From: Allan Jardine Date: Fri, 20 Jan 2012 21:48:45 +0000 Subject: [PATCH] Dev: New: _DT_RowIndex is a private parameter that is attached to all TR elements in the table now. This allows fast reverse mapping from the row index to the aoData entry (typically this will be used for getting _aData). Before we would have to loop over all rows which could be very slow, but this reverse mapping allows several new options for optimisations and future enhancements. Dev: Updated: All fnRender calls have been put into a single point - code reuse... --- media/js/jquery.dataTables.js | 86 +++++++++++++++++++---------------- media/src/DataTables.js | 2 +- media/src/api/api.internal.js | 3 +- media/src/api/api.methods.js | 20 ++++---- media/src/core/core.data.js | 39 ++++++++++------ media/src/core/core.draw.js | 22 ++++----- 6 files changed, 94 insertions(+), 78 deletions(-) diff --git a/media/js/jquery.dataTables.js b/media/js/jquery.dataTables.js index 9d6c56fc..56a0bad0 100644 --- a/media/js/jquery.dataTables.js +++ b/media/js/jquery.dataTables.js @@ -21,7 +21,7 @@ */ /*jslint evil: true, undef: true, browser: true */ -/*globals $, jQuery,_fnExternApiFunc,_fnInitialise,_fnInitComplete,_fnLanguageCompat,_fnAddColumn,_fnColumnOptions,_fnAddData,_fnCreateTr,_fnGatherData,_fnBuildHead,_fnDrawHead,_fnDraw,_fnReDraw,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnServerParams,_fnAddOptionsHtml,_fnFeatureHtmlTable,_fnScrollDraw,_fnAdjustColumnSizing,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnBuildSearchArray,_fnBuildSearchRow,_fnFilterCreateSearch,_fnDataToSearch,_fnSort,_fnSortAttachListener,_fnSortingClasses,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnFeatureHtmlLength,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnNodeToDataIndex,_fnVisbleColumns,_fnCalculateEnd,_fnConvertToWidth,_fnCalculateColumnWidths,_fnScrollingWidthAdjust,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnDetectType,_fnSettingsFromNode,_fnGetDataMaster,_fnGetTrNodes,_fnGetTdNodes,_fnEscapeRegex,_fnDeleteIndex,_fnReOrderIndex,_fnColumnOrdering,_fnLog,_fnClearTable,_fnSaveState,_fnLoadState,_fnCreateCookie,_fnReadCookie,_fnDetectHeader,_fnGetUniqueThs,_fnScrollBarWidth,_fnApplyToChildren,_fnMap,_fnGetRowData,_fnGetCellData,_fnSetCellData,_fnGetObjectDataFn,_fnSetObjectDataFn,_fnApplyColumnDefs,_fnBindAction,_fnCallbackReg,_fnCallbackFire,_fnJsonString*/ +/*globals $, jQuery,_fnExternApiFunc,_fnInitialise,_fnInitComplete,_fnLanguageCompat,_fnAddColumn,_fnColumnOptions,_fnAddData,_fnCreateTr,_fnGatherData,_fnBuildHead,_fnDrawHead,_fnDraw,_fnReDraw,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnServerParams,_fnAddOptionsHtml,_fnFeatureHtmlTable,_fnScrollDraw,_fnAdjustColumnSizing,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnBuildSearchArray,_fnBuildSearchRow,_fnFilterCreateSearch,_fnDataToSearch,_fnSort,_fnSortAttachListener,_fnSortingClasses,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnFeatureHtmlLength,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnNodeToDataIndex,_fnVisbleColumns,_fnCalculateEnd,_fnConvertToWidth,_fnCalculateColumnWidths,_fnScrollingWidthAdjust,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnDetectType,_fnSettingsFromNode,_fnGetDataMaster,_fnGetTrNodes,_fnGetTdNodes,_fnEscapeRegex,_fnDeleteIndex,_fnReOrderIndex,_fnColumnOrdering,_fnLog,_fnClearTable,_fnSaveState,_fnLoadState,_fnCreateCookie,_fnReadCookie,_fnDetectHeader,_fnGetUniqueThs,_fnScrollBarWidth,_fnApplyToChildren,_fnMap,_fnGetRowData,_fnGetCellData,_fnSetCellData,_fnGetObjectDataFn,_fnSetObjectDataFn,_fnApplyColumnDefs,_fnBindAction,_fnCallbackReg,_fnCallbackFire,_fnJsonString,_fnRender*/ (/** @lends */function($, window, document, undefined) { /** @@ -459,13 +459,7 @@ /* Use rendered data for filtering/sorting */ if ( typeof oCol.fnRender === 'function' && oCol.bUseRendered && oCol.mDataProp !== null ) { - _fnSetCellData( oSettings, iRow, i, oCol.fnRender( { - "iDataRow": iRow, - "iDataColumn": i, - "aData": oData._aData, - "oSettings": oSettings, - "mDataProp": oCol.mDataProp - }, _fnGetCellData(oSettings, iRow, i, 'display') ) ); + _fnSetCellData( oSettings, iRow, i, _fnRender(oSettings, iRow, i) ); } /* See if we should auto-detect the column type */ @@ -527,6 +521,7 @@ if ( nTrs[i].nodeName.toUpperCase() == "TR" ) { iThisIndex = oSettings.aoData.length; + nTrs[i]._DT_RowIndex = iThisIndex; oSettings.aoData.push( $.extend( true, {}, DataTable.models.oRow, { "nTr": nTrs[i] } ) ); @@ -616,13 +611,7 @@ /* Rendering */ if ( bRender ) { - sRendered = oCol.fnRender( { - "iDataRow": iRow, - "iDataColumn": iColumn, - "aData": oData._aData, - "oSettings": oSettings, - "mDataProp": oCol.mDataProp - }, _fnGetCellData(oSettings, iRow, iColumn, 'display') ); + sRendered = _fnRender( oSettings, iRow, iColumn ); nCell.innerHTML = sRendered; if ( oCol.bUseRendered ) { @@ -968,6 +957,28 @@ } + /** + * Call the developer defined fnRender function for a given cell (row/column) with + * the required parameters and return the result. + * @param {object} oSettings dataTables settings object + * @param {int} iRow aoData index for the row + * @param {int} iCol aoColumns index for the column + * @returns {*} Return of the developer's fnRender function + * @memberof DataTable#oApi + */ + function _fnRender( oSettings, iRow, iCol ) + { + var oCol = oSettings.aoColumns[iCol]; + + return oCol.fnRender( { + "iDataRow": iRow, + "iDataColumn": iCol, + "oSettings": oSettings, + "aData": oSettings.aoData[iRow]._aData, + "mDataProp": oCol.mDataProp + }, _fnGetCellData(oSettings, iRow, iCol, 'display') ); + } + /** * Create a new TR element (and it's TD children) for a row @@ -984,6 +995,11 @@ { oData.nTr = document.createElement('tr'); + /* Use a private property on the node to allow reserve mapping from the node + * to the aoData array for fast look up + */ + oData.nTr._DT_RowIndex = iRow; + /* Special parameters can be given by the data source to be used on the row */ if ( oData._aData.DT_RowId ) { @@ -1004,20 +1020,9 @@ /* Render if needed - if bUseRendered is true then we already have the rendered * value in the data source - so can just use that */ - if ( typeof oCol.fnRender === 'function' && (!oCol.bUseRendered || oCol.mDataProp === null) ) - { - nTd.innerHTML = oCol.fnRender( { - "iDataRow": iRow, - "iDataColumn": i, - "aData": oData._aData, - "oSettings": oSettings, - "mDataProp": oCol.mDataProp - }, _fnGetCellData(oSettings, iRow, i, 'display') ); - } - else - { - nTd.innerHTML = _fnGetCellData( oSettings, iRow, i, 'display' ); - } + nTd.innerHTML = (typeof oCol.fnRender === 'function' && (!oCol.bUseRendered || oCol.mDataProp === null)) ? + _fnRender( oSettings, iRow, i ) : + _fnGetCellData( oSettings, iRow, i, 'display' ); /* Add user defined class */ if ( oCol.sClass !== null ) @@ -5056,13 +5061,22 @@ { /* Find settings from table node */ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - var i, iAODataIndex; + var i, iLen, iAODataIndex; iAODataIndex = (typeof mTarget === 'object') ? _fnNodeToDataIndex(oSettings, mTarget) : mTarget; /* Return the data array from this row */ var oData = oSettings.aoData.splice( iAODataIndex, 1 ); + + /* Update the _DT_RowIndex parameter */ + for ( i=0, iLen=oSettings.aoData.length ; i */function($, window, document, undefined) { /** diff --git a/media/src/api/api.internal.js b/media/src/api/api.internal.js index 82b55e49..cf2fb627 100644 --- a/media/src/api/api.internal.js +++ b/media/src/api/api.internal.js @@ -110,7 +110,8 @@ this.oApi = { "_fnExtend": _fnExtend, "_fnCallbackReg": _fnCallbackReg, "_fnCallbackFire": _fnCallbackFire, - "_fnJsonString": _fnJsonString + "_fnJsonString": _fnJsonString, + "_fnRender": _fnRender }; $.extend( DataTable.ext.oApi, this.oApi ); diff --git a/media/src/api/api.methods.js b/media/src/api/api.methods.js index 580a23a0..bed22f1c 100644 --- a/media/src/api/api.methods.js +++ b/media/src/api/api.methods.js @@ -315,13 +315,22 @@ this.fnDeleteRow = function( mTarget, fnCallBack, bRedraw ) { /* Find settings from table node */ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ); - var i, iAODataIndex; + var i, iLen, iAODataIndex; iAODataIndex = (typeof mTarget === 'object') ? _fnNodeToDataIndex(oSettings, mTarget) : mTarget; /* Return the data array from this row */ var oData = oSettings.aoData.splice( iAODataIndex, 1 ); + + /* Update the _DT_RowIndex parameter */ + for ( i=0, iLen=oSettings.aoData.length ; i