Tôi nghĩ bạn đúng. Phương pháp này quá toàn cầu ...
Tuy nhiên - đó là một mặc định tốt khi cuộc gọi AJAX của bạn không có hiệu lực trên chính trang đó. (lưu nền chẳng hạn). (bạn luôn có thể tắt nó cho một cuộc gọi ajax nào đó bằng cách chuyển "global": false - xem tài liệu tại jquery
Khi cuộc gọi AJAX có nghĩa là làm mới một phần của trang, tôi thích hình ảnh "đang tải" của mình được dành riêng cho phần được làm mới. Tôi muốn xem phần nào được làm mới.
Hãy tưởng tượng nó sẽ tuyệt như thế nào nếu bạn có thể chỉ cần viết một cái gì đó như:
$("#component_to_refresh").ajax( { ... } );
Và điều này sẽ hiển thị một "tải" trên phần này. Dưới đây là một chức năng tôi đã viết xử lý hiển thị "đang tải" nhưng nó dành riêng cho khu vực bạn đang làm mới trong ajax.
Trước tiên, hãy để tôi chỉ cho bạn cách sử dụng nó
<!-- 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});
})
Và đây là chức năng - một khởi đầu cơ bản mà bạn có thể nâng cao theo ý muốn. nó rất linh hoạt
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);
};