Ich glaube, Du hast recht. Diese Methode ist zu global ...
Dies ist jedoch eine gute Standardeinstellung, wenn Ihr AJAX-Aufruf keine Auswirkungen auf die Seite selbst hat. (Hintergrund speichern zum Beispiel). (Sie können es jederzeit für einen bestimmten Ajax-Aufruf ausschalten, indem Sie "global" übergeben: false - siehe Dokumentation bei jquery
Wenn der AJAX-Aufruf einen Teil der Seite aktualisieren soll, möchte ich, dass meine "Lade" -Bilder spezifisch für den aktualisierten Abschnitt sind. Ich würde gerne sehen, welcher Teil aktualisiert wird.
Stellen Sie sich vor, wie cool es wäre, wenn Sie einfach etwas schreiben könnten wie:
$("#component_to_refresh").ajax( { ... } );
Und dies würde ein "Laden" in diesem Abschnitt anzeigen. Unten ist eine Funktion, die ich geschrieben habe und die auch das "Laden" der Anzeige behandelt, die jedoch spezifisch für den Bereich ist, den Sie in Ajax aktualisieren.
Lassen Sie mich zunächst zeigen, wie man es benutzt
<!-- 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});
})
Und dies ist die Funktion - ein grundlegender Start, den Sie nach Belieben verbessern können. es ist sehr flexibel.
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);
};