The style of the pagination options that Datatables presents to the end-user can greatly effect the look and feel of your table, as well as, of course, the interaction behaviour. Through the plug-in options you can define your own paging function to create the interaction that you are looking for.
To use a pagination plug-in, you must include the pagination plug-in code from the plug-ins available below, after you load the DataTables library, but before you initialise the DataTable. When initialising the DataTable, you must also tell it to make use of this plug-in, rather than using the default built-in types, by setting the 'sPaginationType' to the value required by the plug-in. As an example the code below makes use of the scrolling pagination plug-in saved into a file (live example):
<script type="text/javascript" src="jquery.dataTables.js"></script> <script type="text/javascript" src="dataTables.scrollingPagination.js"></script> <script type="text/javascript"> $(document).ready(function() { $('#example').dataTable( { "sPaginationType": "scrolling" } ); } ); </script>
Twitter Bootstrap
Show details |
This plug-in provides the mark-up needed for using Twitter Bootstrap's pagination styling with DataTables. Note that this plug-in uses the fnPagingInfo API plug-in method to obtain paging information. |
Author: | Allan Jardine |
Code: |
/* API method to get paging information */ $.fn.dataTableExt.oApi.fnPagingInfo = function ( oSettings ) { return { "iStart": oSettings._iDisplayStart, "iEnd": oSettings.fnDisplayEnd(), "iLength": oSettings._iDisplayLength, "iTotal": oSettings.fnRecordsTotal(), "iFilteredTotal": oSettings.fnRecordsDisplay(), "iPage": oSettings._iDisplayLength === -1 ? 0 : Math.ceil( oSettings._iDisplayStart / oSettings._iDisplayLength ), "iTotalPages": oSettings._iDisplayLength === -1 ? 0 : Math.ceil( oSettings.fnRecordsDisplay() / oSettings._iDisplayLength ) }; } /* Bootstrap style pagination control */ $.extend( $.fn.dataTableExt.oPagination, { "bootstrap": { "fnInit": function( oSettings, nPaging, fnDraw ) { var oLang = oSettings.oLanguage.oPaginate; var fnClickHandler = function ( e ) { e.preventDefault(); if ( oSettings.oApi._fnPageChange(oSettings, e.data.action) ) { fnDraw( oSettings ); } }; $(nPaging).addClass('pagination').append( '<ul>'+ '<li class="prev disabled"><a href="#">← '+oLang.sPrevious+'</a></li>'+ '<li class="next disabled"><a href="#">'+oLang.sNext+' → </a></li>'+ '</ul>' ); var els = $('a', nPaging); $(els[0]).bind( 'click.DT', { action: "previous" }, fnClickHandler ); $(els[1]).bind( 'click.DT', { action: "next" }, fnClickHandler ); }, "fnUpdate": function ( oSettings, fnDraw ) { var iListLength = 5; var oPaging = oSettings.oInstance.fnPagingInfo(); var an = oSettings.aanFeatures.p; var i, j, sClass, iStart, iEnd, iHalf=Math.floor(iListLength/2); if ( oPaging.iTotalPages < iListLength) { iStart = 1; iEnd = oPaging.iTotalPages; } else if ( oPaging.iPage <= iHalf ) { iStart = 1; iEnd = iListLength; } else if ( oPaging.iPage >= (oPaging.iTotalPages-iHalf) ) { iStart = oPaging.iTotalPages - iListLength + 1; iEnd = oPaging.iTotalPages; } else { iStart = oPaging.iPage - iHalf + 1; iEnd = iStart + iListLength - 1; } for ( i=0, iLen=an.length ; i<iLen ; i++ ) { // Remove the middle elements $('li:gt(0)', an[i]).filter(':not(:last)').remove(); // Add the new list items and their event handlers for ( j=iStart ; j<=iEnd ; j++ ) { sClass = (j==oPaging.iPage+1) ? 'class="active"' : ''; $('<li '+sClass+'><a href="#">'+j+'</a></li>') .insertBefore( $('li:last', an[i])[0] ) .bind('click', function (e) { e.preventDefault(); oSettings._iDisplayStart = (parseInt($('a', this).text(),10)-1) * oPaging.iLength; fnDraw( oSettings ); } ); } // Add / remove disabled classes from the static elements if ( oPaging.iPage === 0 ) { $('li:first', an[i]).addClass('disabled'); } else { $('li:first', an[i]).removeClass('disabled'); } if ( oPaging.iPage === oPaging.iTotalPages-1 || oPaging.iTotalPages === 0 ) { $('li:last', an[i]).addClass('disabled'); } else { $('li:last', an[i]).removeClass('disabled'); } } } } } ); |
Example: |
$(document).ready(function() { $('#example').dataTable( { "sPaginationType": "bootstrap" } ); } ); |
Ellipses
Show details |
This plug-in adds another pagination option similar to full_numbers, except it adds ellipses around the page numbers when applicable. You can set how many page numbers should be displayed with the iShowPages option. This plug-in extends the oStdClasses object with the following properties: sPageEllipsis, sPageNumber and sPageNumbers. It also extends the oSettings object with the following properties: _iShowPages, _iShowPagesHalf, _iCurrentPage, _iTotalPages, _iFirstPage and _iLastPage. |
Author: | Dave Kennedy |
Code: |
$.extend($.fn.dataTableExt.oStdClasses, { 'sPageEllipsis': 'paginate_ellipsis', 'sPageNumber': 'paginate_number', 'sPageNumbers': 'paginate_numbers' }); $.fn.dataTableExt.oPagination.ellipses = { 'oDefaults': { 'iShowPages': 5 }, 'fnClickHandler': function(e) { var fnCallbackDraw = e.data.fnCallbackDraw, oSettings = e.data.oSettings, sPage = e.data.sPage; if ($(this).is('[disabled]')) { return false; } oSettings.oApi._fnPageChange(oSettings, sPage); fnCallbackDraw(oSettings); return true; }, // fnInit is called once for each instance of pager 'fnInit': function(oSettings, nPager, fnCallbackDraw) { var oClasses = oSettings.oClasses, oLang = oSettings.oLanguage.oPaginate, that = this; var iShowPages = oSettings.oInit.iShowPages || this.oDefaults.iShowPages, iShowPagesHalf = Math.floor(iShowPages / 2); $.extend(oSettings, { _iShowPages: iShowPages, _iShowPagesHalf: iShowPagesHalf, }); var oFirst = $('<a class="' + oClasses.sPageButton + ' ' + oClasses.sPageFirst + '">' + oLang.sFirst + '</a>'), oPrevious = $('<a class="' + oClasses.sPageButton + ' ' + oClasses.sPagePrevious + '">' + oLang.sPrevious + '</a>'), oNumbers = $('<span class="' + oClasses.sPageNumbers + '"></span>'), oNext = $('<a class="' + oClasses.sPageButton + ' ' + oClasses.sPageNext + '">' + oLang.sNext + '</a>'), oLast = $('<a class="' + oClasses.sPageButton + ' ' + oClasses.sPageLast + '">' + oLang.sLast + '</a>'); oFirst.click({ 'fnCallbackDraw': fnCallbackDraw, 'oSettings': oSettings, 'sPage': 'first' }, that.fnClickHandler); oPrevious.click({ 'fnCallbackDraw': fnCallbackDraw, 'oSettings': oSettings, 'sPage': 'previous' }, that.fnClickHandler); oNext.click({ 'fnCallbackDraw': fnCallbackDraw, 'oSettings': oSettings, 'sPage': 'next' }, that.fnClickHandler); oLast.click({ 'fnCallbackDraw': fnCallbackDraw, 'oSettings': oSettings, 'sPage': 'last' }, that.fnClickHandler); // Draw $(nPager).append(oFirst, oPrevious, oNumbers, oNext, oLast); }, // fnUpdate is only called once while table is rendered 'fnUpdate': function(oSettings, fnCallbackDraw) { var oClasses = oSettings.oClasses, that = this; var tableWrapper = oSettings.nTableWrapper; // Update stateful properties this.fnUpdateState(oSettings); if (oSettings._iCurrentPage === 1) { $('.' + oClasses.sPageFirst, tableWrapper).attr('disabled', true); $('.' + oClasses.sPagePrevious, tableWrapper).attr('disabled', true); } else { $('.' + oClasses.sPageFirst, tableWrapper).removeAttr('disabled'); $('.' + oClasses.sPagePrevious, tableWrapper).removeAttr('disabled'); } if (oSettings._iTotalPages === 0 || oSettings._iCurrentPage === oSettings._iTotalPages) { $('.' + oClasses.sPageNext, tableWrapper).attr('disabled', true); $('.' + oClasses.sPageLast, tableWrapper).attr('disabled', true); } else { $('.' + oClasses.sPageNext, tableWrapper).removeAttr('disabled'); $('.' + oClasses.sPageLast, tableWrapper).removeAttr('disabled'); } var i, oNumber, oNumbers = $('.' + oClasses.sPageNumbers, tableWrapper); // Erase oNumbers.html(''); for (i = oSettings._iFirstPage; i <= oSettings._iLastPage; i++) { oNumber = $('<a class="' + oClasses.sPageButton + ' ' + oClasses.sPageNumber + '">' + oSettings.fnFormatNumber(i) + '</a>'); if (oSettings._iCurrentPage === i) { oNumber.attr('active', true).attr('disabled', true); } else { oNumber.click({ 'fnCallbackDraw': fnCallbackDraw, 'oSettings': oSettings, 'sPage': i - 1 }, that.fnClickHandler); } // Draw oNumbers.append(oNumber); } // Add ellipses if (1 < oSettings._iFirstPage) { oNumbers.prepend('<span class="' + oClasses.sPageEllipsis + '">...</span>'); } if (oSettings._iLastPage < oSettings._iTotalPages) { oNumbers.append('<span class="' + oClasses.sPageEllipsis + '">...</span>'); } }, // fnUpdateState used to be part of fnUpdate // The reason for moving is so we can access current state info before fnUpdate is called 'fnUpdateState': function(oSettings) { var iCurrentPage = Math.ceil((oSettings._iDisplayStart + 1) / oSettings._iDisplayLength), iTotalPages = Math.ceil(oSettings.fnRecordsDisplay() / oSettings._iDisplayLength), iFirstPage = iCurrentPage - oSettings._iShowPagesHalf, iLastPage = iCurrentPage + oSettings._iShowPagesHalf; if (iTotalPages < oSettings._iShowPages) { iFirstPage = 1; iLastPage = iTotalPages; } else if (iFirstPage < 1) { iFirstPage = 1; iLastPage = oSettings._iShowPages; } else if (iLastPage > iTotalPages) { iFirstPage = (iTotalPages - oSettings._iShowPages) + 1; iLastPage = iTotalPages; } $.extend(oSettings, { _iCurrentPage: iCurrentPage, _iTotalPages: iTotalPages, _iFirstPage: iFirstPage, _iLastPage: iLastPage }); } }; |
Example: |
$(document).ready(function() { $('#example').dataTable({ 'sPaginationType': 'ellipses' }); }); |
ExtJS style
Show details |
This pagination plug-in provides pagination controls for DataTables which match the style and interaction of the ExtJS library's grid component. |
Author: | Zach Curtis |
Code: |
$.fn.dataTableExt.oPagination.extStyle = { "fnInit": function (oSettings, nPaging, fnCallbackDraw) { nFirst = $('<span />', { 'class': 'paginate_button first' }); nPrevious = $('<span />', { 'class': 'paginate_button previous' }); nNext = $('<span />', { 'class': 'paginate_button next' }); nLast = $('<span />', { 'class': 'paginate_button last' }); nPageTxt = $("<span />", { text: 'Page' }); nPageNumBox = $('<input />', { type: 'text', val: 1, 'class': 'pageinate_input_box' }); nPageOf = $('<span />', { text: 'of' }); nTotalPages = $('<span />', { text: parseInt(oSettings.aoData.length / oSettings._iDisplayLength, 10) }); $(nPaging) .append(nFirst) .append(nPrevious) .append(nPageTxt) .append(nPageNumBox) .append(nPageOf) .append(nTotalPages) .append(nNext) .append(nLast); nFirst.click(function () { oSettings.oApi._fnPageChange(oSettings, "first"); fnCallbackDraw(oSettings); nPageNumBox.val(parseInt(oSettings._iDisplayEnd / oSettings._iDisplayLength, 10)); }).bind('selectstart', function () { return false; }); nPrevious.click(function () { oSettings.oApi._fnPageChange(oSettings, "previous"); fnCallbackDraw(oSettings); nPageNumBox.val(parseInt(oSettings._iDisplayEnd / oSettings._iDisplayLength, 10)); }).bind('selectstart', function () { return false; }); nNext.click(function () { oSettings.oApi._fnPageChange(oSettings, "next"); fnCallbackDraw(oSettings); nPageNumBox.val(parseInt(oSettings._iDisplayEnd / oSettings._iDisplayLength, 10)); }).bind('selectstart', function () { return false; }); nLast.click(function () { oSettings.oApi._fnPageChange(oSettings, "last"); fnCallbackDraw(oSettings); nPageNumBox.val(parseInt(oSettings._iDisplayEnd / oSettings._iDisplayLength,10 )); }).bind('selectstart', function () { return false; }); nPageNumBox.focus(function () { $(this).attr("style", "border-color: #D0B39A"); }).blur(function () { $(this).attr("style", "border-color: #C9C9C9"); }).change(function () { var pageValue = parseInt($(this).val(), 10); if ((pageValue !== NaN) && pageValue > 0 && pageValue < oSettings.aoData.length) { oSettings._iDisplayStart = $(this).val(); fnCallbackDraw(oSettings); } }); }, "fnUpdate": function (oSettings, fnCallbackDraw) { if (!oSettings.aanFeatures.p) { return; } /* Loop over each instance of the pager */ var an = oSettings.aanFeatures.p; for (var i = 0, iLen = an.length; i < iLen; i++) { //var buttons = an[i].getElementsByTagName('span'); var buttons = $(an[i]).find('span.paginate_button'); if (oSettings._iDisplayStart === 0) { buttons.eq(0).attr("class", "paginate_disabled_first paginate_button"); buttons.eq(1).attr("class", "paginate_disabled_previous paginate_button"); } else { buttons.eq(0).attr("class", "paginate_enabled_first paginate_button"); buttons.eq(1).attr("class", "paginate_enabled_previous paginate_button"); } if (oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay()) { buttons.eq(2).attr("class", "paginate_disabled_next paginate_button"); buttons.eq(3).attr("class", "paginate_disabled_last paginate_button"); } else { buttons.eq(2).attr("class", "paginate_enabled_next paginate_button"); buttons.eq(3).attr("class", "paginate_enabled_last paginate_button"); } } } }; |
Example: |
$(document).ready(function() { $('#example').dataTable( { "sPaginationType": "extStyle" } ); } ); |
Four button navigation
Show details |
The built-in pagination functions provide either two buttons (forward / back) or lots of buttons (forward, back, first, last and individual pages). This plug-in meets the two in the middle providing navigation controls for forward, back, first and last. |
Author: | Allan Jardine |
Code: |
$.fn.dataTableExt.oPagination.four_button = { "fnInit": function ( oSettings, nPaging, fnCallbackDraw ) { nFirst = document.createElement( 'span' ); nPrevious = document.createElement( 'span' ); nNext = document.createElement( 'span' ); nLast = document.createElement( 'span' ); nFirst.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sFirst ) ); nPrevious.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sPrevious ) ); nNext.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sNext ) ); nLast.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sLast ) ); nFirst.className = "paginate_button first"; nPrevious.className = "paginate_button previous"; nNext.className="paginate_button next"; nLast.className = "paginate_button last"; nPaging.appendChild( nFirst ); nPaging.appendChild( nPrevious ); nPaging.appendChild( nNext ); nPaging.appendChild( nLast ); $(nFirst).click( function () { oSettings.oApi._fnPageChange( oSettings, "first" ); fnCallbackDraw( oSettings ); } ); $(nPrevious).click( function() { oSettings.oApi._fnPageChange( oSettings, "previous" ); fnCallbackDraw( oSettings ); } ); $(nNext).click( function() { oSettings.oApi._fnPageChange( oSettings, "next" ); fnCallbackDraw( oSettings ); } ); $(nLast).click( function() { oSettings.oApi._fnPageChange( oSettings, "last" ); fnCallbackDraw( oSettings ); } ); /* Disallow text selection */ $(nFirst).bind( 'selectstart', function () { return false; } ); $(nPrevious).bind( 'selectstart', function () { return false; } ); $(nNext).bind( 'selectstart', function () { return false; } ); $(nLast).bind( 'selectstart', function () { return false; } ); }, "fnUpdate": function ( oSettings, fnCallbackDraw ) { if ( !oSettings.aanFeatures.p ) { return; } /* Loop over each instance of the pager */ var an = oSettings.aanFeatures.p; for ( var i=0, iLen=an.length ; i<iLen ; i++ ) { var buttons = an[i].getElementsByTagName('span'); if ( oSettings._iDisplayStart === 0 ) { buttons[0].className = "paginate_disabled_previous"; buttons[1].className = "paginate_disabled_previous"; } else { buttons[0].className = "paginate_enabled_previous"; buttons[1].className = "paginate_enabled_previous"; } if ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() ) { buttons[2].className = "paginate_disabled_next"; buttons[3].className = "paginate_disabled_next"; } else { buttons[2].className = "paginate_enabled_next"; buttons[3].className = "paginate_enabled_next"; } } } }; |
Example: |
$(document).ready(function() { $('#example').dataTable( { "sPaginationType": "four_button" } ); } ); |
Navigation with text input
Show details |
Sometimes for quick navigation, it can be useful to allow an end user to enter which page they wish to jump to manually. This paging control uses a text input box to accept new paging numbers (arrow keys are also allowed for), and four standard navigation buttons are also presented to the end user. |
Author: | Allan Jardine |
Code: |
$.fn.dataTableExt.oPagination.input = { "fnInit": function ( oSettings, nPaging, fnCallbackDraw ) { var nFirst = document.createElement( 'span' ); var nPrevious = document.createElement( 'span' ); var nNext = document.createElement( 'span' ); var nLast = document.createElement( 'span' ); var nInput = document.createElement( 'input' ); var nPage = document.createElement( 'span' ); var nOf = document.createElement( 'span' ); nFirst.innerHTML = oSettings.oLanguage.oPaginate.sFirst; nPrevious.innerHTML = oSettings.oLanguage.oPaginate.sPrevious; nNext.innerHTML = oSettings.oLanguage.oPaginate.sNext; nLast.innerHTML = oSettings.oLanguage.oPaginate.sLast; nFirst.className = "paginate_button first"; nPrevious.className = "paginate_button previous"; nNext.className="paginate_button next"; nLast.className = "paginate_button last"; nOf.className = "paginate_of"; nPage.className = "paginate_page"; if ( oSettings.sTableId !== '' ) { nPaging.setAttribute( 'id', oSettings.sTableId+'_paginate' ); nPrevious.setAttribute( 'id', oSettings.sTableId+'_previous' ); nPrevious.setAttribute( 'id', oSettings.sTableId+'_previous' ); nNext.setAttribute( 'id', oSettings.sTableId+'_next' ); nLast.setAttribute( 'id', oSettings.sTableId+'_last' ); } nInput.type = "text"; nInput.style.width = "15px"; nInput.style.display = "inline"; nPage.innerHTML = "Page "; nPaging.appendChild( nFirst ); nPaging.appendChild( nPrevious ); nPaging.appendChild( nPage ); nPaging.appendChild( nInput ); nPaging.appendChild( nOf ); nPaging.appendChild( nNext ); nPaging.appendChild( nLast ); $(nFirst).click( function () { oSettings.oApi._fnPageChange( oSettings, "first" ); fnCallbackDraw( oSettings ); } ); $(nPrevious).click( function() { oSettings.oApi._fnPageChange( oSettings, "previous" ); fnCallbackDraw( oSettings ); } ); $(nNext).click( function() { oSettings.oApi._fnPageChange( oSettings, "next" ); fnCallbackDraw( oSettings ); } ); $(nLast).click( function() { oSettings.oApi._fnPageChange( oSettings, "last" ); fnCallbackDraw( oSettings ); } ); $(nInput).keyup( function (e) { if ( e.which == 38 || e.which == 39 ) { this.value++; } else if ( (e.which == 37 || e.which == 40) && this.value > 1 ) { this.value--; } if ( this.value == "" || this.value.match(/[^0-9]/) ) { /* Nothing entered or non-numeric character */ return; } var iNewStart = oSettings._iDisplayLength * (this.value - 1); if ( iNewStart > oSettings.fnRecordsDisplay() ) { /* Display overrun */ oSettings._iDisplayStart = (Math.ceil((oSettings.fnRecordsDisplay()-1) / oSettings._iDisplayLength)-1) * oSettings._iDisplayLength; fnCallbackDraw( oSettings ); return; } oSettings._iDisplayStart = iNewStart; fnCallbackDraw( oSettings ); } ); /* Take the brutal approach to cancelling text selection */ $('span', nPaging).bind( 'mousedown', function () { return false; } ); $('span', nPaging).bind( 'selectstart', function () { return false; } ); }, "fnUpdate": function ( oSettings, fnCallbackDraw ) { if ( !oSettings.aanFeatures.p ) { return; } var iPages = Math.ceil((oSettings.fnRecordsDisplay()) / oSettings._iDisplayLength); var iCurrentPage = Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength) + 1; /* Loop over each instance of the pager */ var an = oSettings.aanFeatures.p; for ( var i=0, iLen=an.length ; i<iLen ; i++ ) { var spans = an[i].getElementsByTagName('span'); var inputs = an[i].getElementsByTagName('input'); spans[3].innerHTML = " of "+iPages inputs[0].value = iCurrentPage; } } }; |
Example: |
$(document).ready(function() { $('#example').dataTable( { "sPaginationType": "input" } ); } ); |
Scrolling navigation
Show details |
This modification of DataTables' standard two button pagination controls adds a little animation effect to the paging action by redrawing the table multiple times for each event, each draw progressing by one row until the required point in the table is reached. |
Author: | Allan Jardine |
Code: |
/* Time between each scrolling frame */ $.fn.dataTableExt.oPagination.iTweenTime = 100; $.fn.dataTableExt.oPagination.scrolling = { "fnInit": function ( oSettings, nPaging, fnCallbackDraw ) { var oLang = oSettings.oLanguage.oPaginate; var oClasses = oSettings.oClasses; var fnClickHandler = function ( e ) { if ( oSettings.oApi._fnPageChange( oSettings, e.data.action ) ) { fnCallbackDraw( oSettings ); } }; var sAppend = (!oSettings.bJUI) ? '<a class="'+oSettings.oClasses.sPagePrevDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button">'+oLang.sPrevious+'</a>'+ '<a class="'+oSettings.oClasses.sPageNextDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button">'+oLang.sNext+'</a>' : '<a class="'+oSettings.oClasses.sPagePrevDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button"><span class="'+oSettings.oClasses.sPageJUIPrev+'"></span></a>'+ '<a class="'+oSettings.oClasses.sPageNextDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button"><span class="'+oSettings.oClasses.sPageJUINext+'"></span></a>'; $(nPaging).append( sAppend ); var els = $('a', nPaging); var nPrevious = els[0], nNext = els[1]; oSettings.oApi._fnBindAction( nPrevious, {action: "previous"}, function() { /* Disallow paging event during a current paging event */ if ( typeof oSettings.iPagingLoopStart != 'undefined' && oSettings.iPagingLoopStart != -1 ) { return; } oSettings.iPagingLoopStart = oSettings._iDisplayStart; oSettings.iPagingEnd = oSettings._iDisplayStart - oSettings._iDisplayLength; /* Correct for underrun */ if ( oSettings.iPagingEnd < 0 ) { oSettings.iPagingEnd = 0; } var iTween = $.fn.dataTableExt.oPagination.iTweenTime; var innerLoop = function () { if ( oSettings.iPagingLoopStart > oSettings.iPagingEnd ) { oSettings.iPagingLoopStart--; oSettings._iDisplayStart = oSettings.iPagingLoopStart; fnCallbackDraw( oSettings ); setTimeout( function() { innerLoop(); }, iTween ); } else { oSettings.iPagingLoopStart = -1; } }; innerLoop(); } ); oSettings.oApi._fnBindAction( nNext, {action: "next"}, function() { /* Disallow paging event during a current paging event */ if ( typeof oSettings.iPagingLoopStart != 'undefined' && oSettings.iPagingLoopStart != -1 ) { return; } oSettings.iPagingLoopStart = oSettings._iDisplayStart; /* Make sure we are not over running the display array */ if ( oSettings._iDisplayStart + oSettings._iDisplayLength < oSettings.fnRecordsDisplay() ) { oSettings.iPagingEnd = oSettings._iDisplayStart + oSettings._iDisplayLength; } var iTween = $.fn.dataTableExt.oPagination.iTweenTime; var innerLoop = function () { if ( oSettings.iPagingLoopStart < oSettings.iPagingEnd ) { oSettings.iPagingLoopStart++; oSettings._iDisplayStart = oSettings.iPagingLoopStart; fnCallbackDraw( oSettings ); setTimeout( function() { innerLoop(); }, iTween ); } else { oSettings.iPagingLoopStart = -1; } }; innerLoop(); } ); }, "fnUpdate": function ( oSettings, fnCallbackDraw ) { if ( !oSettings.aanFeatures.p ) { return; } /* Loop over each instance of the pager */ var an = oSettings.aanFeatures.p; for ( var i=0, iLen=an.length ; i<iLen ; i++ ) { if ( an[i].childNodes.length !== 0 ) { an[i].childNodes[0].className = ( oSettings._iDisplayStart === 0 ) ? oSettings.oClasses.sPagePrevDisabled : oSettings.oClasses.sPagePrevEnabled; an[i].childNodes[1].className = ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() ) ? oSettings.oClasses.sPageNextDisabled : oSettings.oClasses.sPageNextEnabled; } } } }; |
Example: |
$(document).ready(function() { $('#example').dataTable( { "sPaginationType": "scrolling" } ); } ); |