2012-07-30 10 views
11

Estoy tratando de mostrar un indicador de carga para cada solicitud de ajax, estoy trabajando en una aplicación de rails 3.Cómo mostrar un ícono animado durante el procesamiento de solicitud Ajax - Rails 3

HTML:

<div id="loading-indicator"> 
<%= image_tag("loading.gif", :id => "loading-indicator", :style => "display:none") %> 
</div> 

CSS:

#loading-indicator { 
    position: absolute; 
    left: 10px; 
    top: 10px; 
} 

loading.js: que he colocado en Assest/javascript/

$(document).ready(function(){ 
    $(document).ajaxSend(function(event, request, settings) { 
     $('#loading-indicator').show(); 
    }); 

    $(document).ajaxComplete(function(event, request, settings) { 
     $('#loading-indicator').hide(); 
    }); 
}); 

Mis application.js se ve así:

//= require jquery 
//= require jquery_ujs 
//= require bootstrap 
//= require_tree . 

Se dosent trabajo y no aparece nada. Cualquier ayuda sería apreciada.

+0

¡Empezaría por echar un vistazo a la consola de error de JS para ver si algo salió mal! También verifique que loading.js esté correctamente cargado ejecutando el encabezado del código HTML generado. –

+0

@AnthonyAlberto Está correctamente cargado y no recibí el error en firebug – SHUMAcupcake

+0

¿Es GET o POST? Además, ¿qué tipo de elemento html (es decir, ** a **, ** botón **, ** entrada ** etc.) está tratando de ajaxificar? El archivo UJS de rieles establece [diferentes valores predeterminados de ajax] (http://blog.madebydna.com/all/code/2011/12/05/ajax-in-rails-3.html) dependiendo de la categoría del elemento html – stephenmurdoch

Respuesta

16

que suelen tener este pedazo de código guardado en situaciones como estas:

$(function() { 
    $('#loading-indicator') 
    .hide() // hide it initially. 
    .ajaxStart(function() { 
     $(this).show(); // show on any Ajax event. 
    }) 
    .ajaxStop(function() { 
     $(this).hide(); // hide it when it is done. 
    }); 
}); 

--- --- EDITAR

Esto no funcionará con las últimas versiones de jQuery. A partir de jQuery 1.8, el método .ajaxStart() solo debe adjuntarse al document. El código, por tanto, debe buscar la manera siguiente:

$(function() { 
    $('#loading-indicator').hide(); // hide it initially. 
    $(document) 
    .ajaxStart(function() { 
     $('#loading-indicator').show(); // show on any Ajax event. 
    }) 
    .ajaxStop(function() { 
     $('#loading-indicator').hide(); // hide it when it is done. 
    }); 
}); 
+0

sin (documento) .ready (función)? o con eso? – SHUMAcupcake

+0

Dentro de la función JQuery ready.Editado la respuesta. – MurifoX

+0

soory mate no funcionó. - Tal vez tengo que agregar algo de duración? se carga a rápido? – SHUMAcupcake

0

El problema estaba en la etiqueta de estilo CSS y la posición css

que lo fijan al hacer esto:

HTML:

<div id="loading-indicator"> 
<%= image_tag("loading.gif", :id => "loading-indicator") %> 
</div> 

CSS:

#loading-indicator { 
    left: 10px; 
    top: 10px; 
} 
3

Técnicamente no puede usar el mismo "id" dos veces para dos elementos diferentes en el mismo documento. es decir, está asignando id = "indicador de carga" a las etiquetas div e img; esto podría estar causando errores de selección y manipulación de JS DOM.

Cuestiones relacionadas