我想知道是否有可能「鉤住」每一個AJAX請求(無論是因爲它將要發送,還是事件)並執行一個操作。在這一點上,我假設頁面上還有其他第三方腳本。其中一些可能會使用jQuery,而另一些則不會。這可能嗎?爲頁面上的所有AJAX請求添加一個「鉤子」
回答
受aviv's answer的啓發,我做了一些調查,這就是我想出來的。
根據腳本中的註釋,我不確定它是否有用,當然只適用於使用本機XMLHttpRequest對象的瀏覽器。
我認爲它會工作,如果JavaScript庫正在使用,因爲他們將盡可能使用本機對象。
function addXMLRequestCallback(callback){
var oldSend, i;
if(XMLHttpRequest.callbacks) {
// we've already overridden send() so just add the callback
XMLHttpRequest.callbacks.push(callback);
} else {
// create a callback queue
XMLHttpRequest.callbacks = [callback];
// store the native send()
oldSend = XMLHttpRequest.prototype.send;
// override the native send()
XMLHttpRequest.prototype.send = function(){
// process the callback queue
// the xhr instance is passed into each callback but seems pretty useless
// you can't tell what its destination is or call abort() without an error
// so only really good for logging that a request has happened
// I could be wrong, I hope so...
// EDIT: I suppose you could override the onreadystatechange handler though
for(i = 0; i < XMLHttpRequest.callbacks.length; i++) {
XMLHttpRequest.callbacks[i](this);
}
// call the native send()
oldSend.apply(this, arguments);
}
}
}
// e.g.
addXMLRequestCallback(function(xhr) {
console.log(xhr.responseText); // (an empty string)
});
addXMLRequestCallback(function(xhr) {
console.dir(xhr); // have a look if there is anything useful here
});
創意。 JS技巧再次挽救了這一天。 –
這將是很好的擴展此響應以支持請求後鉤子 –
根據您的實施,我已經發布了一些關於NPM的東西,可以同時處理請求和響應! https://開頭github上。com/slorber/ajax-interceptor –
有一個技巧來做到這一點。
在所有腳本運行之前,取原始的XHMHttpReuqest對象並將其保存在不同的var中。然後覆蓋原始的XMLHttpRequest並通過您自己的對象將所有調用指向它。
的僞代碼:
var savd = XMLHttpRequest;
XMLHttpRequest.prototype = function() {
this.init = function() {
}; // your code
etc' etc'
};
這個答案並不完全正確,如果你改變一個物體的原型,即使保存的物體也會改變。整個原型也被一個函數取代,這個函數將打破所有的Ajax請求。儘管如此,它的確激勵我提供了一個答案。 – meouw
既然你提到的jQuery,我知道jQuery提供一個.ajaxSetup()
方法,設置全局AJAX選項,其中包括事件觸發像success
,error
,並beforeSend
- 這是什麼聽起來像什麼你正在尋找。
$.ajaxSetup({
beforeSend: function() {
//do stuff before request fires
}
});
當然,您需要在任何嘗試使用此解決方案的頁面上驗證jQuery可用性。
感謝您的建議,但不幸的是,這不會攔截未使用AJAX的AJAX調用。 – Yuliy
...閱讀您的評論.... – jondavidjohn
在今天的消息:獨角獸殺死的AJAX調用沒有使用AJAX – Dashu
除了meouw的回答,我不得不將代碼注入攔截XHR調用的iframe,並使用了上面的答案。但是,我不得不改變
XMLHttpRequest.prototype.send = function(){
要:
XMLHttpRequest.prototype.send = function(arguments)
我不得不改變
oldSend.apply(this, arguments);
要:
oldSend.call(this, arguments);
這是必須得到它的工作在IE9中用IE8文件m ode。如果未進行此修改,則組件框架(Visual WebGUI)生成的一些回調無效。在這些鏈接更多信息:
沒有進行這些修改AJAX回傳並沒有終止。
jquery ...
<script>
$(document).ajaxSuccess(
function(event, xhr, settings){
alert(xhr.responseText);
}
);
</script>
jQuery不會捕獲使用其他庫進行的請求。例如ExtJS。如果你只使用jQuery,這是一個很好的答案。否則,它不會一直工作。 – npiani
它甚至不會抓住jquery請求,如果jQuery實例不同。如果需要,更改原型 –
使用的「meouw」的答案,我建議使用下面的解決方案,如果你想看到的要求
function addXMLRequestCallback(callback) {
var oldSend, i;
if(XMLHttpRequest.callbacks) {
// we've already overridden send() so just add the callback
XMLHttpRequest.callbacks.push(callback);
} else {
// create a callback queue
XMLHttpRequest.callbacks = [callback];
// store the native send()
oldSend = XMLHttpRequest.prototype.send;
// override the native send()
XMLHttpRequest.prototype.send = function() {
// call the native send()
oldSend.apply(this, arguments);
this.onreadystatechange = function (progress) {
for(i = 0; i < XMLHttpRequest.callbacks.length; i++) {
XMLHttpRequest.callbacks[i](progress);
}
};
}
}
}
addXMLRequestCallback(function(progress) {
if (typeof progress.srcElement.responseText != 'undefined' && progress.srcElement.responseText != '') {
console.log(progress.srcElement.responseText.length);
}
});
結果。如果你沒有支持< = IE8可以做這將全面攔截任何 AJAX,並且不會阻塞任何可能由任何第三方AJAX庫分配的回調等。接受的答案不會產生實際的回答,因爲它太早被調用。
(function() {
var origOpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function() {
console.log('request started!');
this.addEventListener('load', function() {
console.log('request completed!');
console.log(this.readyState); //will always be 4 (ajax is completed successfully)
console.log(this.responseText); //whatever the response was
});
origOpen.apply(this, arguments);
};
})();
,你可以在這裏做與API的addEventListener這裏有些什麼更多的文檔:
謝謝!那是完美的。 我只修改了一點:'this.status'在這種情況下返回服務器狀態'200',如果請求沒問題的話,404如果找不到元素,500等等。但是代碼很完美。 – MrMins
這對你來說可能會感覺老舊,但你應該得到所有的愛。我深陷困境。謝謝一堆。 –
只是因爲我爲此搜尋了一下。 ''load''事件只在成功時被調用。如果你不關心結果(只是查詢結束了),你可以使用「loadend」事件 –
我已經找到了一個好的圖書館在Github上,做的工作做好,你必須包括之前,任何其他js文件
https://github.com/jpillora/xhook
這裏要說的是增加了一個HTTP標頭的任何一個例子INCOM荷蘭國際集團響應
xhook.after(function(request, response) {
response.headers['Foo'] = 'Bar';
});
太棒了!但即使使用人行橫道最新的Chrome瀏覽器插件,也沒有在Cordova應用程序上工作! –
這對我的特殊需求非常合適:在Wordpress中,從Events Organizer插件過濾事件 –
Ajax-hook是開源LIB鉤全球XMLHttpRequest對象,並更改默認Ajax請求和響應。 github上:https://github.com/wendux/Ajax-hook,例如:
hookAjax({
//hook callbacks
onreadystatechange:function(xhr){
console.log("onreadystatechange called: %O",xhr)
},
onload:function(xhr){
console.log("onload called: %O",xhr)
},
//hook function
open:function(arg,xhr){
console.log("open called: method:%s,url:%s,async:%s",arg[0],arg[1],arg[2])
}
})
- 1. 添加ajax請求到元素附加上一個AJAX請求
- 2. 所有頁面的登錄鉤子
- 3. 用AJAX請求刮一個頁面
- 4. 用AJAX請求刮一個頁面
- 5. 將所有頁面請求重定向到一個頁面
- 6. jquery ajax - 爲每個ajax請求添加一個通用參數
- 7. ajax - 從一個頁面上的多個文件請求數據?
- 8. 用ajax請求添加表單到現有頁面
- 9. 將WooCommerce鉤子添加到Wordpress頁面
- 10. d在一頁上多個Ajax請求
- 11. Hapijs - 爲所有請求添加cookie
- 12. ajax請求中的Ajax請求失敗 - 重新加載整個頁面
- 13. 將請求頁面從通過AJAX一個子工作?
- 14. 對同一頁面的Ajax請求
- 15. 拒絕所有請求,除非請求實際上是一個子請求
- 16. 製作頁面加載後二Ajax請求,但只有一次
- 17. jQuery的添加在PHP頁面的Ajax請求不起作用
- 18. 在頁面上跟蹤Ajax請求
- 19. jQuery:在頁面上的每個ajax請求上添加子對象到「數據」對象
- 20. 來自一個頁面的Ajax請求和另一個頁面中的響應
- 21. jQuery ajax頁面請求
- 22. Ajax請求到php頁面
- 23. 將XML請求的結果添加到一個頁面
- 24. 在MVC上添加所需的防僞字段Ajax請求
- 25. 的document.ready一個Ajax加載頁面上
- 26. ajax請求,但刷新整個頁面?
- 27. 我希望所有的頁面請求都指向一個頁面
- 28. jQuery - 檢測所有的AJAX請求頁上
- 29. 爲什麼添加jquery動畫方法會打破頁面上的所有AJAX?
- 30. Python請求庫預先請求鉤子
這是可能使用jQuery,因此有可能與普通的舊JavaScript,但需要有他們每個人至少2「掛鉤」。無論如何,爲什麼要在同一個頁面上使用兩個? – yoda
如何使用此庫? https://github.com/slorber/ajax-interceptor –
這是一個不錯的解決方案:http://stackoverflow.com/questions/25335648/how-to-intercept-all-ajax-requests-made-by-different- js-libraries – phazei