Myślę, że masz rację. Ta metoda jest zbyt globalna ...
Jednak - jest to dobre ustawienie domyślne, gdy wywołanie AJAX nie ma wpływu na samą stronę. (na przykład zapisywanie w tle). (zawsze możesz go wyłączyć dla określonego wywołania ajax, przekazując „global”: false - zobacz dokumentację w jquery
Gdy wywołanie AJAX ma na celu odświeżenie części strony, podoba mi się, że moje „ładowanie” obrazów jest specyficzne dla odświeżonej sekcji. Chciałbym zobaczyć, która część jest odświeżana.
Wyobraź sobie, jak fajnie by było, gdybyś mógł po prostu napisać coś takiego:
$("#component_to_refresh").ajax( { ... } );
Oznaczałoby to „ładowanie” w tej sekcji. Poniżej jest funkcja, którą napisałem, która obsługuje również wyświetlanie „ładowania”, ale jest specyficzna dla obszaru, który odświeżasz w ajax.
Najpierw pokażę ci, jak z niego korzystać
<!-- 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});
})
I to jest funkcja - podstawowy start, który możesz ulepszyć, jak chcesz. jest bardzo elastyczny.
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);
};