Penso che tu abbia ragione. Questo metodo è troppo globale ...
Tuttavia, è un buon valore predefinito per quando la chiamata AJAX non ha alcun effetto sulla pagina stessa. (ad esempio il salvataggio in background). (puoi sempre spegnerlo per una certa chiamata ajax passando "global": false - vedi la documentazione su jquery
Quando la chiamata AJAX ha lo scopo di aggiornare parte della pagina, mi piace che le mie immagini di "caricamento" siano specifiche della sezione aggiornata. Vorrei vedere quale parte è stata aggiornata.
Immagina quanto sarebbe bello se tu potessi semplicemente scrivere qualcosa del tipo:
$("#component_to_refresh").ajax( { ... } );
E questo mostrerebbe un "caricamento" in questa sezione. Di seguito è una funzione che ho scritto che gestisce anche il "caricamento" del display ma è specifica dell'area che si sta aggiornando in ajax.
Prima di tutto, lascia che ti mostri come 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});
})
E questa è la funzione: un inizio di base che puoi migliorare come desideri. è molto flessibile.
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);
};