2012-03-09 155 views
1

我已经构建了一个Web应用程序,它在很多不同的页面上大量使用jQuery.ajax()函数。当然,每次使用jQuery.ajax()都会传递一个配置对象和一个函数作为'success'属性的回调函数。执行前拦截jQuery.ajax的'成功'回调函数

我现在遇到了一种情况,我希望全局在多个页面上执行某个操作,如果服务器返回任何给定ajax请求的某个错误代码。我想通过在我的页面的头部包含javascript来覆盖jQuery库的一部分,这会执行条件检查操作,然后继续执行配置对象中传递的任何回调函数。这可能吗?我目前正在审查jQuery库的来源,看看我能否做到这一点。

回答

3

我想你需要看看全局Ajax事件处理程序。

http://api.jquery.com/category/ajax/global-ajax-event-handlers/

+2

全局AJAX的事件处理程序成功后的回调(例如)被解雇。如果OP在实际成功被解雇之前想要做一些事情,他将无法使用全局事件处理程序来完成。 – 2013-04-09 23:37:34

2

在jQuery的1.5 +,您可以通过converters选项$.ajax做到这一点。通常情况下,转换器只是将从Web服务器接收到的数据转换成成功回调,但如果需要,您可以在其中运行其他代码。

将此代码放入嵌入在所有页面上的js文件中。

$.ajaxSetup({ 
    // the converter option is a list of dataType-to-dataType conversion functions 
    // example: converters['text json'] is a function that accepts text and returns an object 
    // note: to redefine any single converter, you must redefine all of them 
    converters: { 
     "text json": function (text) { 
      // NOTE: this converter must return a parsed version of the json     
      var result = jQuery.parseJSON(text); 
      if (result.errorMessage) { 
       // catch the error message and alert 
       alert(result.errorMessage) 
      } 
      return result;    
     }, 
     "text html": true,   
     "* text": window.String, 
     "text xml": jQuery.parseXML 
    } 
}); 

完整的示例: http://jsfiddle.net/waltbosz/8a8fZ/

0

我结束了使用$.ajaxSetup覆盖从全球的成功回调,像这样:

$.ajaxSetup({ 
    beforeSend: function(xhr, options) { 
     var originalSuccess = options.success 
     options.success = function(data, textStatus, jqXhr) { 
      // trigger some sort of event here for interested listeners 
      originalSuccess.apply(this, arguments) 
     } 
    } 
})