返回值:undefinedjQuery.ajaxPrefilter([dataTypes], handler(options, originalOptions, jqXHR))

预前过滤器,用于在每个请求发送之前,并且在 $.ajax() 处理之前,设置自定义 Ajax 选项或者修改已经存在的选项。

下面是一个典型的注册预前过滤器的例子:

$.ajaxPrefilter( function( options, originalOptions, jqXHR ) {
  // Modify options, control originalOptions, store jqXHR, etc
});

参数说明:

  • options 是请求选项
  • originalOptions 是提供给 ajax 方法的未经修改的选项。因此,没有 ajaxSettings 设置中的默认值
  • jqXHR 是请求用的 jqXHR 对象

预前过滤器非常适用于需要提前处理自定义选项的情况。例如,下面的代码在调用 $.ajax() 时,如果将 abortOnRetry 选项设置为 true,那么就会自动取消对相同 URL 的请求:

var currentRequests = {};

$.ajaxPrefilter(function( options, originalOptions, jqXHR ) {
  if ( options.abortOnRetry ) {
    if ( currentRequests[ options.url ] ) {
      currentRequests[ options.url ].abort();
    }
    currentRequests[ options.url ] = jqXHR;
  }
});

预前过滤器同样可用于修改已经存在的选项。例如,通过 http://mydomain.net/proxy/ 进行代理跨域请求:

$.ajaxPrefilter( function( options ) {
  if ( options.crossDomain ) {
    options.url = "http://mydomain.net/proxy/" + encodeURIComponent( options.url );
    options.crossDomain = false;
  }
});

如果提供了可选的 dataTypes 参数,那么预前过滤器只会对满足指定 dataTypes 的请求有效。例如,指定一个只对 JSON 和 script 请求有效的预前过滤器:

$.ajaxPrefilter( "json script", function( options, originalOptions, jqXHR ) {
  // Modify options, control originalOptions, store jqXHR, etc
});

$.ajaxPrefilter() 方法也可以通过返回 dataType 的方式,重定向一个请求到返回的 dataType 类型。例如下面的例子,如果 URL 中含有在 isActuallyScript() 函数中设定的指定属性,那么就将请求设置成 "script" 请求:

$.ajaxPrefilter(function( options ) {
  if ( isActuallyScript( options.url ) ) {
    return "script";
  }
});

这不但保证了请求被认为是 "script" 类型的,而且也保证了所有对 script 数据类型有效的预前过滤器,同样也会对该请求起作用。