我有一个应用程序,它在很多地方使用Ajax.Request及其onSuccess事件处理程序。
在所有这些onSuccess事件触发之前,我需要调用一个函数(它将检查响应)。我试着在onComplete事件中使用onComplete,但它在Ajax.Request的onSuccess事件之后触发。有什么建议吗?
发布于 2009-05-11 04:02:11
这可能有点晚了,但为了其他对同样问题感到好奇的人的利益,我将提出这个解决方案:
您可以使用原型自己的面向方面编程的实现来实现这一点。当然,您必须修改所有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请求的需要,选择几个包装器函数。
发布于 2010-02-05 06:47:03
类似于Aleksander的回答,但我相信这将防止您在任何地方都使用“包装”,将其合并到onCreate响应程序中。
Ajax.Responders.register({
onCreate: function(request) {
request.options['onSuccess'] = request.options['onSuccess'].wrap(validateResponse);
}
});发布于 2008-11-13 09:21:57
您可以在onSuccess中的其他代码之前运行您的方法,并在出现问题时返回false。
https://stackoverflow.com/questions/286603
复制相似问题