我有一個使用Ajax.Request
並在很多地方它onSuccess
事件處理程序的應用程序。擴展每個Ajax.Request的事件的onSuccess(使用Javascript原型框架)
我需要之前所有這些onSuccess
事件觸發調用一個函數(將檢查響應)。我嘗試使用Ajax.Responders.register
與onComplete
事件,但它Ajax.Request
的onSuccess
事件後觸發。有什麼建議麼?
我有一個使用Ajax.Request
並在很多地方它onSuccess
事件處理程序的應用程序。擴展每個Ajax.Request的事件的onSuccess(使用Javascript原型框架)
我需要之前所有這些onSuccess
事件觸發調用一個函數(將檢查響應)。我嘗試使用Ajax.Responders.register
與onComplete
事件,但它Ajax.Request
的onSuccess
事件後觸發。有什麼建議麼?
這可能是有點晚,但對於其他人想知道同樣問題的利益,我會提出此解決方案:
您可以使用自己的原型是否履行面向方面編程的離子來做到這一點。當然,您將不得不修改所有onSuccess參數,但可以通過簡單的搜索和替換來完成,而不是更新所有的回調函數。下面是一個例子的Ajax.Request創建:
new Ajax.Request('example.html', {
parameters: {action: 'update'},
onSuccess: this.updateSuccessful
});
說你也有類似的代碼段遍佈你的代碼,你要preceed他們都具有一定的功能,運行的實際功能之前驗證響應(甚至根本不能運行)。通過使用Funtion。包裹在原型提供我們可以通過擴展上面的代碼做到這一點:
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函數只需快速搜索onSuccess並粘貼'wrap(validateResponse)'即可。這也使您可以根據特定的Ajax請求的需要選擇幾個包裝函數。
您可以的onSuccess其他代碼之前運行方法並返回false如果事情是錯誤的。
是的你是對的,但我有很多onsuccess事件已經註冊到處。我想要做的只是擴展基於成功事件。 – matte 2008-11-13 09:24:40
有幾個events to chose from。下面是Ajax.Request
事件鏈:
onCreate
onUninitialized
onLoading
onLoaded
onInteractive
onXYZ
,onSuccess
或onFailure
onComplete
onLoading
,onLoaded
,onInteractive
聽起來有趣,但根據the spec他們不是一定會發生的。這使得您能夠鉤在onCreate
,這被稱爲後立即請求對象是建立的可能性,但該請求實際上之前作出。它曾經是什麼做的,除了每一次顯示一個警告框,獨立於JS框架(種)
var oldFunc = Ajax.Request.onSuccess;
Ajax.Request.onSuccess = function foo() {
alert('t');
oldFunc.apply(this, arguments);
}
這將「擴展」您的JS功能使其做正是 -
「通解」它執行前...
類似於Aleksander Krzywinski的回答,但我相信這會阻止你在任何地方撒上使用「wrap」的東西,把它合併到onCreate Responder。
Ajax.Responders.register({
onCreate: function(request) {
request.options['onSuccess'] = request.options['onSuccess'].wrap(validateResponse);
}
});
不知道這是否是最乾淨的解決方案,但對我來說它的確有竅門。
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;
您正在使用哪種語言? – Ady 2008-11-13 09:21:01
嗨,Ady,我使用JavaScript原型框架 – matte 2008-11-13 09:22:31