Utilidad de paginación flexible para el front-end en JavaScript

Esta herramienta de paginación en JavaScript ofrece una solución adaptable para implementar controles de navegación de páginas en interfaces web. El código es modular y permite personalización según los requisitos del proyecto.

Función para generar controles de paginación

La siguiente función crea dinámicamente el HTML para los botones de naevgación, basándose en parámetros de configuración.


/**
 * Genera controles de paginación.
 * @param {number} itemsPerPage - Elementos por página.
 * @param {number} currentPage - Página actual.
 * @param {number} totalPages - Total de páginas.
 * @param {string} callbackFunction - Nombre de la función de retrollamada.
 * @returns {string} HTML de los controles.
 */
function crearPaginador(itemsPerPage, currentPage, totalPages, callbackFunction) {
    const maxVisible = 7; // Cantidad máxima de números de página visibles
    let startPage = 1;
    let endPage = totalPages;
    
    if (totalPages > maxVisible) {
        const halfRange = Math.floor(maxVisible / 2);
        if (currentPage > totalPages - halfRange) {
            startPage = totalPages - maxVisible + 1;
            endPage = totalPages;
        } else if (currentPage <= halfRange + 1) {
            startPage = 1;
            endPage = maxVisible;
        } else {
            startPage = currentPage - halfRange;
            endPage = currentPage + halfRange;
        }
    }
    
    let paginationHTML = `<div class="pagination-wrapper"><span class="page-info">Página <strong>${currentPage}</strong> de <strong>${totalPages}</strong>, ${itemsPerPage} elementos por página</span>`;
    
    if (currentPage > 1) {
        paginationHTML += `<a class="page-link" onclick="${callbackFunction}(1, ${itemsPerPage})">Primera</a>`;
        paginationHTML += `<a class="page-link" onclick="${callbackFunction}(${currentPage - 1}, ${itemsPerPage})">Anterior</a>`;
    }
    
    for (let pageNum = startPage; pageNum <= endPage; pageNum++) {
        if (pageNum === currentPage) {
            paginationHTML += `<a class="active-page">${pageNum}</a>`;
        } else {
            paginationHTML += `<a class="page-link" onclick="${callbackFunction}(${pageNum}, ${itemsPerPage})" title="Página ${pageNum}">${pageNum}</a>`;
        }
    }
    
    if (currentPage < totalPages) {
        paginationHTML += `<a class="page-link" onclick="${callbackFunction}(${currentPage + 1}, ${itemsPerPage})">Siguiente</a>`;
        paginationHTML += `<a class="page-link" onclick="${callbackFunction}(${totalPages}, ${itemsPerPage})">Última</a>`;
    }
    
    paginationHTML += `</div>`;
    return paginationHTML;
}

Estructura HTML del contenedor

Define un área en el documento donde se inyectarán los controles de paginación.


<div class="pagination-container">
    <div id="pagination-controls"></div>
</div>

Estilos CSS para los controles

Estilos básicos para una apariencia coherente y responsive.


.page-link {
    color: #333;
    text-decoration: none;
    padding: 8px 16px;
    border: 1px solid #ddd;
    display: inline-block;
    margin-left: -1px;
    text-align: center;
    cursor: pointer;
}
.page-link:hover {
    background-color: #f5f5f5;
}
.active-page {
    padding: 8px 16px;
    background-color: #007bff;
    color: white;
    border: 1px solid #007bff;
    display: inline-block;
    cursor: default;
}
.page-info {
    margin-right: 10px;
    padding: 8px 16px;
    border: 1px solid #ddd;
    display: inline-block;
    color: #555;
}
.pagination-wrapper {
    display: flex;
    align-items: center;
    justify-content: center;
    margin: 20px 0;
    flex-wrap: wrap;
}

Integración con llamadas AJAX

Ejemplo de cómo utilizar la función de paginación con una solicitud AJAX para obtener datos del servidor.


function fetchPageData(pageNum, itemsPerPage) {
    $.ajax({
        contentType: "application/json; charset=utf-8",
        url: `?page=${pageNum}&limit=${itemsPerPage}`,
        type: "POST",
        dataType: "json",
        success: function(response) {
            if (response) {
                const calculatedTotalPages = Math.ceil(response.totalItems / itemsPerPage);
                $('#pagination-controls').html(crearPaginador(itemsPerPage, pageNum, calculatedTotalPages, 'fetchPageData'));
            }
        }
    });
}

La función de retrollamada especificada en el último parámetro de crearPaginador debe coincidir con el nombre de la función que maneja la carga de datos, como se muestra en el ejemplo.

Etiquetas: JavaScript Paginación css HTML jQuery

Publicado el 6-16 04:38