为了解决这些问题,我开发了jQuery的插件,名为:Ajax请求状态管理器。使用这个插件可以让loading不再那么麻烦了。你可以在触发ajax请求前,用该插件事先添加写好所有请求,你要做的只是在用户交互的事件中执行下.request()方法。你可以将一个页面上所有请求设置为显示loading,也可以设置为全局显示(只显示一个loading)。下面是插件的具体使用方法:
自定义loading的css样式:
.state-loading { background: #fff url(images/icon-ajax-loader.gif) ... }
引用jquery最新版本文件:
script>
注意:该插件只在jquery1.4.4及之后的版本中测试通过。
引用Ajax请求状态管理器插件文件:
结果为['module1', 'module2', 'module3']。你可以通过返回的数组来删除指定的其中一个模块的loading,也可以不指定,也就是全部删除,当然如果你需要这样做的话。
remove()方法删除指定的模块:
$.loader( key ).remove( moduleId );
参数说明:
moduleId:string或者array,指定为string的话会删除其中一个module,指定为数组会批量删除模块,如果未指定参数,会将模块全部删除。
示例
添加2个模块到名为userinfo的加载器中:
代码如下:
var id1 = $.loader( 'userinfo' ).add(
$( '#userinfo, #top-userinfo' ),
{ url: 'server/userinfo.php' },
function( data ) {
updateContent( $( '#userinfo, #topsection, #footer-userinfo' ), data );
}
);
再添加一个模块到userinfo的加载器中:
var id2 = $.loader( 'userinfo' ).add( $('#footer-userinfo') );
var idList = id1.concat( id2 );
// result: [ 'module1', 'module2', 'module3' ]
删除第2个模块的loading,也就是‘#top-userinfo':
var ret = $.loader( 'userinfo' ).remove( idList[1] );
// result: true, modules: [ 'module1', 'module3' ]
在交互事件中执行.request()方法:
$.loader( key ).request();
]
当然,你也可以抛弃之前add的ajax settings和callback,在交互事件中自己写$.ajax或$.get等。然后在请求前调用$.loader( key ).show(),在回调函数内调用$.loader( key ).hide()。这样也可以灵活控制loading的状态。
示例
代码如下:
$( '#getUserInfo' ).bind( 'click', function() {
$.loader( 'userinfo' ).request();
});
你也可以从新重新写请求:
代码如下:
$( '#getUserInfo' ).bind( 'click', function() {
$.loader( 'userinfo' ).show();
$.get( 'server/userinfo.php', function( data ) {
$.loader( 'userinfo' ).hide();
updateContent( $( '#userinfo, #topsection, #footer-userinfo' ), data );
})
});
注意:一个请求反复触发时,管理器会执行abor()来阻止之前未完成的请求,重新发布新的请求,然而如果你在页面中通过jquery的ajaxError事件输出错误信息,会把该信息一并认为是错误的,所以如果有必要的话,需要你自行过滤。
示例
代码如下:
// 输出错误日志
$( 'body' ).bind( 'ajaxError', function( event, xhr, setting, thrownError ) {
// 过滤掉 abort 的错误信息
if ( xhr.status === 0 || xhr.readyState === 0 || xhr.statusText === 'abort' ) {
return;
}
$( '#log' ).append( '
' + thrownError + '
' );打包下载:Ajax请求状态管理器。