1
0
mirror of https://github.com/DataTables/DataTables.git synced 2025-02-20 18:54:15 +01:00

Updated: Optimisation on fnDeleteRow to simply remove the search array entry, rather than rebuilding the whole array, also on fnUpdate to only rebuild the single row, rather than the entire thing, and finally fnAddData - allow the redraw to update the search array.

This commit is contained in:
Allan Jardine 2010-10-16 10:06:49 +01:00
parent 27627b287d
commit d41c572798
2 changed files with 77 additions and 26 deletions

View File

@ -26,7 +26,7 @@
* building the dynamic multi-column sort functions.
*/
/*jslint evil: true, undef: true, browser: true */
/*globals $, jQuery,_fnExternApiFunc,_fnInitalise,_fnLanguageProcess,_fnAddColumn,_fnColumnOptions,_fnAddData,_fnGatherData,_fnDrawHead,_fnDraw,_fnReDraw,_fnAjaxUpdate,_fnAjaxUpdateDraw,_fnAddOptionsHtml,_fnFeatureHtmlTable,_fnScrollDraw,_fnAjustColumnSizing,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnBuildSearchArray,_fnFilterCreateSearch,_fnDataToSearch,_fnSort,_fnSortAttachListener,_fnSortingClasses,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnFeatureHtmlLength,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnNodeToDataIndex,_fnVisbleColumns,_fnCalculateEnd,_fnConvertToWidth,_fnCalculateColumnWidths,_fnScrollingWidthAdjust,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnArrayCmp,_fnDetectType,_fnSettingsFromNode,_fnGetDataMaster,_fnGetTrNodes,_fnGetTdNodes,_fnEscapeRegex,_fnDeleteIndex,_fnReOrderIndex,_fnColumnOrdering,_fnLog,_fnClearTable,_fnSaveState,_fnLoadState,_fnCreateCookie,_fnReadCookie,_fnGetUniqueThs,_fnScrollBarWidth,_fnApplyToChildren,_fnMap*/
/*globals $, jQuery,_fnExternApiFunc,_fnInitalise,_fnLanguageProcess,_fnAddColumn,_fnColumnOptions,_fnAddData,_fnGatherData,_fnDrawHead,_fnDraw,_fnReDraw,_fnAjaxUpdate,_fnAjaxUpdateDraw,_fnAddOptionsHtml,_fnFeatureHtmlTable,_fnScrollDraw,_fnAjustColumnSizing,_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,_fnArrayCmp,_fnDetectType,_fnSettingsFromNode,_fnGetDataMaster,_fnGetTrNodes,_fnGetTdNodes,_fnEscapeRegex,_fnDeleteIndex,_fnReOrderIndex,_fnColumnOrdering,_fnLog,_fnClearTable,_fnSaveState,_fnLoadState,_fnCreateCookie,_fnReadCookie,_fnGetUniqueThs,_fnScrollBarWidth,_fnApplyToChildren,_fnMap*/
(function($, window, document) {
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
@ -1568,9 +1568,6 @@
oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
/* Rebuild the search */
_fnBuildSearchArray( oSettings, 1 );
if ( typeof bRedraw == 'undefined' || bRedraw )
{
_fnReDraw( oSettings );
@ -1600,13 +1597,14 @@
/* Return the data array from this row */
var oData = oSettings.aoData.splice( iAODataIndex, 1 );
/* Remove the target row from the search array */
var iDisplayIndex = $.inArray( iAODataIndex, oSettings.aiDisplay );
oSettings.asDataSearch.splice( iDisplayIndex, 1 );
/* Delete from the display arrays */
_fnDeleteIndex( oSettings.aiDisplayMaster, iAODataIndex );
_fnDeleteIndex( oSettings.aiDisplay, iAODataIndex );
/* Rebuild the search */
_fnBuildSearchArray( oSettings, 1 );
/* If there is a user callback function - call it */
if ( typeof fnCallBack == "function" )
{
@ -1888,10 +1886,16 @@
}
}
/* Modify the search index for this row (strictly this is likely not needed, since fnReDraw
* will rebuild the search array - however, the redraw might be disabled by the user)
*/
var iDisplayIndex = $.inArray( iRow, oSettings.aiDisplay );
oSettings.asDataSearch[iDisplayIndex] = _fnBuildSearchRow( oSettings,
oSettings.aoData[iRow]._aData );
/* Perform pre-draw actions */
if ( typeof bAction == 'undefined' || bAction )
{
_fnBuildSearchArray( oSettings, 1 );
_fnAjustColumnSizing( oSettings );
}
@ -4091,32 +4095,48 @@
/* Clear out the old data */
oSettings.asDataSearch.splice( 0, oSettings.asDataSearch.length );
var nTmp = document.createElement('div');
var aArray = (typeof iMaster != 'undefined' && iMaster == 1) ?
oSettings.aiDisplayMaster : oSettings.aiDisplay;
for ( var i=0, iLen=aArray.length ; i<iLen ; i++ )
{
oSettings.asDataSearch[i] = '';
for ( var j=0, jLen=oSettings.aoColumns.length ; j<jLen ; j++ )
oSettings.asDataSearch[i] = _fnBuildSearchRow( oSettings,
oSettings.aoData[ aArray[i] ]._aData );
}
}
/*
* Function: _fnBuildSearchRow
* Purpose: Create a searchable string from a single data row
* Returns: -
* Inputs: object:oSettings - dataTables settings object
* array:aData - aoData[]._aData array to use for the data to search
*/
function _fnBuildSearchRow( oSettings, aData )
{
var sSearch = '';
var nTmp = document.createElement('div');
for ( var j=0, jLen=oSettings.aoColumns.length ; j<jLen ; j++ )
{
if ( oSettings.aoColumns[j].bSearchable )
{
if ( oSettings.aoColumns[j].bSearchable )
{
var sData = oSettings.aoData[ aArray[i] ]._aData[j];
oSettings.asDataSearch[i] += _fnDataToSearch( sData, oSettings.aoColumns[j].sType )+' ';
}
}
/* If it looks like there is an HTML entity in the string, attempt to decode it */
if ( oSettings.asDataSearch[i].indexOf('&') !== -1 )
{
nTmp.innerHTML = oSettings.asDataSearch[i];
oSettings.asDataSearch[i] = nTmp.textContent ? nTmp.textContent : nTmp.innerText;
/* IE and Opera appear to put an newline where there is a <br> tag - remove it */
oSettings.asDataSearch[i] = oSettings.asDataSearch[i].replace(/\n/g," ").replace(/\r/g,"");
var sData = aData[j];
sSearch += _fnDataToSearch( sData, oSettings.aoColumns[j].sType )+' ';
}
}
/* If it looks like there is an HTML entity in the string, attempt to decode it */
if ( sSearch.indexOf('&') !== -1 )
{
nTmp.innerHTML = sSearch;
sSearch = nTmp.textContent ? nTmp.textContent : nTmp.innerText;
/* IE and Opera appear to put an newline where there is a <br> tag - remove it */
sSearch = sSearch.replace(/\n/g," ").replace(/\r/g,"");
}
return sSearch;
}
/*
@ -6194,6 +6214,7 @@
this.oApi._fnFilterColumn = _fnFilterColumn;
this.oApi._fnFilter = _fnFilter;
this.oApi._fnBuildSearchArray = _fnBuildSearchArray;
this.oApi._fnBuildSearchRow = _fnBuildSearchRow;
this.oApi._fnFilterCreateSearch = _fnFilterCreateSearch;
this.oApi._fnDataToSearch = _fnDataToSearch;
this.oApi._fnSort = _fnSort;

View File

@ -0,0 +1,30 @@
// DATA_TEMPLATE: dom_data
oTest.fnStart( "fnDeleteRow" );
$(document).ready( function () {
/* Check the default */
var oTable = $('#example').dataTable();
var oSettings = oTable.fnSettings();
oTest.fnTest(
"Check that the default data is sane",
null,
function () { return oSettings.asDataSearch.join(' ').match(/4.0/g).length == 3; }
);
oTest.fnTest(
"Remove the first data row, and check that hte search data has been updated",
function () { oTable.fnDeleteRow( 0 ); },
function () { return oSettings.asDataSearch.join(' ').match(/4.0/g).length == 2; }
);
oTest.fnTest(
"Check that the info element has been updated",
null,
function () { return $('#example_info').html() == "Showing 1 to 10 of 56 entries"; }
);
oTest.fnComplete();
} );