Creo que tienes razón. Este método es demasiado global ...
Sin embargo, es un buen valor predeterminado para cuando su llamada AJAX no tiene ningún efecto en la página en sí. (guardar en segundo plano, por ejemplo). (siempre puede desactivarlo para una determinada llamada ajax pasando "global": falso - consulte la documentación en jquery
Cuando la llamada AJAX está destinada a actualizar parte de la página, me gusta que mis imágenes de "carga" sean específicas de la sección actualizada. Me gustaría ver qué parte se actualiza.
Imagina lo genial que sería si pudieras simplemente escribir algo como:
$("#component_to_refresh").ajax( { ... } );
Y esto mostraría una "carga" en esta sección. A continuación se muestra una función que escribí que también maneja la visualización de "carga", pero es específica del área que está actualizando en ajax.
Primero, déjame mostrarte cómo usarlo
<!-- assume you have this HTML and you would like to refresh
it / load the content with ajax -->
<span id="email" name="name" class="ajax-loading">
</span>
<!-- then you have the following javascript -->
$(document).ready(function(){
$("#email").ajax({'url':"/my/url", load:true, global:false});
})
Y esta es la función: un comienzo básico que puede mejorar como desee. Es muy flexible.
jQuery.fn.ajax = function(options)
{
var $this = $(this);
debugger;
function invokeFunc(func, arguments)
{
if ( typeof(func) == "function")
{
func( arguments ) ;
}
}
function _think( obj, think )
{
if ( think )
{
obj.html('<div class="loading" style="background: url(/public/images/loading_1.gif) no-repeat; display:inline-block; width:70px; height:30px; padding-left:25px;"> Loading ... </div>');
}
else
{
obj.find(".loading").hide();
}
}
function makeMeThink( think )
{
if ( $this.is(".ajax-loading") )
{
_think($this,think);
}
else
{
_think($this, think);
}
}
options = $.extend({}, options); // make options not null - ridiculous, but still.
// read more about ajax events
var newoptions = $.extend({
beforeSend: function()
{
invokeFunc(options.beforeSend, null);
makeMeThink(true);
},
complete: function()
{
invokeFunc(options.complete);
makeMeThink(false);
},
success:function(result)
{
invokeFunc(options.success);
if ( options.load )
{
$this.html(result);
}
}
}, options);
$.ajax(newoptions);
};