扩展每个Ajax.Request onSuccess事件(Javascript Prototype Framework)

时间:2008-11-13 09:16:35

标签: javascript ajax prototypejs

我有一个应用程序在很多地方使用Ajax.Request及其onSuccess事件处理程序。

我需要在所有这些onSuccess事件触发之前调用一个函数(将检查响应)。我尝试将Ajax.Responders.registeronComplete事件一起使用,但在Ajax.Request的{​​{1}}事件后触发。有什么建议吗?

6 个答案:

答案 0 :(得分:4)

类似于Aleksander Krzywinski的答案,但我相信这可以防止你不得不在任何地方使用“wrap”,将其整合到onCreate Responder中。

Ajax.Responders.register({

  onCreate: function(request) {

    request.options['onSuccess'] = request.options['onSuccess'].wrap(validateResponse);

  }

});

答案 1 :(得分:3)

有几个events to chose from。以下是Ajax.Request的事件链:

  1. onCreate
  2. onUninitialized
  3. onLoading
  4. onLoaded
  5. onInteractive
  6. onXYZonSuccessonFailure
  7. onComplete
  8. onLoadingonLoadedonInteractive听起来很有趣,但根据the spec,它们并不能保证会发生。这使您可以挂钩到onCreate,这是在构建请求对象之后,但在实际发出请求之前调用的。{/ p>

答案 2 :(得分:1)

您可以在onSuccess中的其他代码之前运行您的方法,如果出错则返回false。

答案 3 :(得分:1)

这可能有点晚了,但为了其他任何想知道同样问题的人的利益,我会提出这个解决方案:

您可以使用Prototypes自己的面向方面编程实现来执行此操作。当然,您必须修改所有的onSuccess参数,但可以通过简单的搜索和替换来完成,而不是更新所有的回调函数。这是一个Ajax.Request创建示例:

new Ajax.Request('example.html', {
    parameters: {action: 'update'},
    onSuccess: this.updateSuccessful
});

假设您的代码中包含类似的代码片段,并且您希望在它们之前使用某个函数,该函数在运行实际函数之前验证响应(甚至可以阻止运行)。通过使用Prototype中提供的Funtion.wrap,我们可以通过扩展上面的代码来实现:

new Ajax.Request('example.html', {
    parameters: {action: 'update'},
    onSuccess: this.updateSuccessful.wrap(validateResponse)
});

其中'validateResponse'是一个类似于此的函数:

// If you use the X-JSON-header of the response for JSON, add the third param
function validateResponse(originalFn, transport /*, json */) {
    // Validate the transport

    if (someConditionMet) {
        originalFn(transport /*, json */);
    }
}

因此,您只需快速搜索onSuccess并粘贴'wrap(validateResponse)',就可以将onSuccess函数扩展到一个中心位置。这也为您提供了根据特定Ajax请求的需要提供多个包装函数的选项。

答案 4 :(得分:1)

不知道这是否是最干净的解决方案,但对我而言,这就是诀窍。


var tmp = Ajax.Request;
Ajax.Request = function(url, args) {
 // stuff to do before the request is sent
 var c = Object.clone(args);
 c.onSuccess = function(transport){
  // stuff to do when request is successful, before the callback
  args.onSuccess(transport);
 }

 var a = new tmp(url, c);
 return a;
}
Ajax.Request.protoype = new tmp();
Ajax.Request.Events = tmp.Events;
delete tmp;

答案 5 :(得分:0)

“通用解决方案” - 独立于JS框架(种类)

var oldFunc = Ajax.Request.onSuccess;
Ajax.Request.onSuccess = function foo() {
  alert('t');
  oldFunc.apply(this, arguments);
}

这将“扩展”你的JS功能,使它完全完成它以前做的事情,除非每次执行前都显示一个警告框......