我有一个应用程序在很多地方使用Ajax.Request
及其onSuccess
事件处理程序。
我需要在所有这些onSuccess
事件触发之前调用一个函数(将检查响应)。我尝试将Ajax.Responders.register
与onComplete
事件一起使用,但在Ajax.Request
的{{1}}事件后触发。有什么建议吗?
答案 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
的事件链:
onCreate
onUninitialized
onLoading
onLoaded
onInteractive
onXYZ
,onSuccess
或onFailure
onComplete
onLoading
,onLoaded
,onInteractive
听起来很有趣,但根据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功能,使它完全完成它以前做的事情,除非每次执行前都显示一个警告框......