entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

0voto

Cargar información sólo al clickearla (Ajaxloader/PHP)

Hola. ¿Qué tal? Les comento mi situación. Tengo una especie de panel (adjunto una imagen y su respectivo código, que es como viene por defecto el nav) con varias opciones, en cada una de ellas le muestran, lógicamente, distintos datos al usuario. Me he dado cuenta que tras ir agregándole más información y consultas PHP a cada una de los apartados en el nav la página (sólo esa en especial, donde se encuentra el nav) está tardando un poquito más que antes en cargar.
He leído y también visto, en algunos casos, en Internet, que varios desarrolladores lo que hacen es colocar un ajaxloader. Así es, al parecer es algo como si no cargaran todos los apartados del nav excepto el activo o principal hasta que no se los clickee. ¿Puede ser esto así? Y recién cuando son clickeados, se cargan, aparece el ajaxloader (en algunos casos, con el típico texto de "Cargando") y finalmente muestra la información.

1 Respuesta

1voto

white Puntos75880

Que tal si incluyes un evento 'click' a los enlaces de las pestañas, y haces la consulta junto con toda la lógica allí.

por ejemplo:

http://jsfiddle.net/3gx9tqkg/

(function () {
    var remoteUrl, getRemoteData, cachedData,
        tabPanelSelector, showLoading, hideLoading,
        loaderLayout;

    cachedData = {};
    loaderLayout = $('<div >')
        .addClass('loading-layout')
        .append($('<i class="glyphicon glyphicon-refresh spinner" >'));

    getRemoteData = function (url) {
        var deferred = $.Deferred();

        if (cachedData[remoteUrl]) {
            return deferred.resolve(cachedData[remoteUrl]);
        }

        return $.ajax({
            method: 'GET',
            dataType: 'json',
            url: url,
            data: {}
        });
    };

    showLoading = function () {
        $(this)
            .append(loaderLayout)
            .find('.loading-layout')
            .fadeIn();
    }

    hideLoading = function () {
        $(this).find('.loading-layout').fadeOut();
    }

    $('#app-tabs a').on('click', function (e) {
        e.preventDefault();
        tabPanelSelector = $(this).data('target');
        remoteUrl = $(this).data('remote');

        if (!$(tabPanelSelector).length) {
            tabPanelSelector = $(this).attr('href');
        }

        showLoading.call($(tabPanelSelector)[0]);

        getRemoteData(remoteUrl).done($.proxy(function (response) {
            $(tabPanelSelector).html(response.body);
            cachedData[remoteUrl] = response;
            hideLoading.call($(tabPanelSelector)[0]);
        }, this));

        $(this).tab('show');
    });

    $('#app-tabs a').first().trigger('click');
})();

PD:

  • yo use el atributo data-remote para obtener la url remota de la pestaña.
  • Use una promesa en jquery ( $.Deferred ) para obtener la respuesta de la url remota
  • llamo al evento click del primer enlace para cargar la primera pestaña.

0voto

MikeNicholas comentado

Hola, gracias por responder. Del jsfiddle que me pasaste pude adaptar todo menos el PHP que tiene el function, me salta este error:

enter image description here

¿Qué podría hacer?

0voto

white comentado

no podría decirte que corregir sin ver la linea 4 en tu index.php, intenta pasarme el codigo desde la linea 1 a la linea 10.

0voto

MikeNicholas comentado

Línea 1 a 61, es justo lo que añadí

<?php include('parts_html/header.php'); ?>
<?php
(function () {
    var remoteUrl, getRemoteData, cachedData,
        tabPanelSelector, showLoading, hideLoading,
        loaderLayout;

    cachedData = {};
    loaderLayout = $('<div >')
        .addClass('loading-layout')
        .append($('<i class="glyphicon glyphicon-refresh spinner" >'));

    getRemoteData = function (url) {
        var deferred = $.Deferred();

        if (cachedData[remoteUrl]) {
            return deferred.resolve(cachedData[remoteUrl]);
        }

        return $.ajax({
            method: 'GET',
            dataType: 'json',
            url: url,
            data: {}
        });
    };

    showLoading = function () {
        $(this)
            .append(loaderLayout)
            .find('.loading-layout')
            .fadeIn();
    }

    hideLoading = function () {
        $(this).find('.loading-layout').fadeOut();
    }

    $('#app-tabs a').on('click', function (e) {
        e.preventDefault();
        tabPanelSelector = $(this).data('target');
        remoteUrl = $(this).data('remote');

        if (!$(tabPanelSelector).length) {
            tabPanelSelector = $(this).attr('href');
        }

        showLoading.call($(tabPanelSelector)[0]);

        getRemoteData(remoteUrl).done($.proxy(function (response) {
            $(tabPanelSelector).html(response.body);
            cachedData[remoteUrl] = response;
            hideLoading.call($(tabPanelSelector)[0]);
        }, this));

        $(this).tab('show');
    });

    $('#app-tabs a').first().trigger('click');
})();
?>

1voto

white comentado

de la linea 3 a la 60 corta todo y pegalo en un nuevo archivo javascript y pega el código, tienes uno ya creado para tu aplicacion? entonces pegalo allí, por ejemplo, deberá estar antes de </body>.

    <script type="text/javascript" src="app.js"></script>
</body>

el error de sintaxis se debe a que el código de la linea 1 a la linea 60 es javascript y no php.

0voto

MikeNicholas comentado

Yo uso un header.php, su función es reducir las líneas en el index.php ya colocando ahí el header, el footer y esas cosas. Ahí he puesto esto (antes del </body>:

<script type="text/javascript" src="app.js"></script>
<body>

Ante la duda coloqué app.js (donde pegué el código que me enviaste) en varios directorios (adm, pages y parts):

En parts tengo el header.
En pages tengo el index.

C:\xampp\htdocs\adm\pages\parts

Tras hacer esto la página sigue cargando igual (al parecer carga todos los datos primero).

0voto

white comentado

el código javascript lo que hace es registrar el evento click de las pestañas de bootstrap. de modo que ahora necesitas definir la ruta remote en cada pestaña.

<li class="active">
    <a aria-expanded="true" data-remote="/home.php" href="#home" data-toggle="tab">Home</a>
</li>

recuerda que lo que debes agregar a tus pestañas es: data-remote="/home.php"

al hacer click obtendría el contenido de localhost/home.php para cargarlo en el panel de la pestaña


reviza denuevo con cuidado el jsfiddle, fijate que te falta en tu html y tu código javascript.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta