使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码

  情景

  如何在特定的请求上实现"ajaxStart"的效果?

  首先,重写Ajax方法的代价太高,仍然可以利用jQuery自身的Ajax Events

  Ajax触发的全局事件会像一个标准事件一样传播到所有DOM节点上。层级:jQuery Events > Ajax Events > 自定义Ajax事件。

  实现

  

复制代码 代码如下:

  Wo = window.Wo || {};

  Wo.ajax = {

  spinner : $([])

  ,init : function() {

  var $spinner = this.spinner = $('#ajax-loading');

  var show = function(e) {

  if(e.namespace === 'Wo') $spinner.show();

  };

  var hide = function(e) {

  $spinner.hide();

  };

  $spinner.bind({

  'ajaxStart.Wo' : show

  ,'ajaxStop.Wo' : hide

  ,'ajaxError.Wo' : hide

  });

  this.adapt(['getJSON','get','post','ajax']);

  }

  // 预备发送请求

  ,_prepare : function() {

  this.spinner.trigger('ajaxStart.Wo');

  }

  // 接口批量变更

  ,adapt : function(fns) {

  var self = this;

  $.each(fns,function(i,fn) {

  Wo[fn] = function() {

  self._prepare();

  $[fn].apply(this,arguments);

  }

  });

  }

  };

  有两种方法可以判断出触发的事件是否为特定的事件:

  确定的命名空间。

  在触发时传递额外的参数给事件处理程序。

  这里用事件的命名空间来进行触发来源的判断。adapt方法相当于适配器的应用,用一套改善的接口替代了另一套接口。

  如果要增加load方法,稍微麻烦一点,因为有可能是ajax方法或者元素的onload事件。

  要添加一个代理方法,并进行类型判断:

  

复制代码 代码如下:

  var _load = $.fn.load;

  $.fn.load = function() {

  $.type(arguments[0]) === 'string' && self._prepare();

  _load.apply(this,arguments);

  return this;

  };

  使用

  所有方法参数仍与原先一致:

  

复制代码 代码如下:

  Wo.post(url, [data,] callback)