I am trying to overwrite the success function upon ajaxsend event but it doesnt work here is the code:
$(document).ajaxSend(function(event,xhr,options){
console.log('ajaxSend');
var tempSuccess = options.success;
options.success = function(data, textStatus, jqXHR){
console.log('start');
tempSuccess(data, textStatus, jqXHR);
console.log('end');
}; xhr.success = options.success;});
upon AJAX I do see 'ajax' in the console, but upon success I can't see the start and the end debug msges..
What do I do wrong?
What you're trying to accomplish can't be done with ajaxSend
. The problem is that ajaxSend
apparently works with a copy of the original xhr
and options
objects, so the modifications won't have any effect. You can easily test this with the following code:
$(document).ajaxSend(function(event, xhr, options){
delete options.success;
console.log(options.success); // undefined
});
$.ajax({
url: "test.html",
success: function() { console.log("this will be printed nevertheless"); }
});
So you can't use ajaxSend
to overwrite the success callbacks. Instead, you will have to "hack" jQuery's AJAX function:
// closure to prevent global access to this stuff
(function(){
// creates a new callback function that also executes the original callback
var SuccessCallback = function(origCallback){
return function(data, textStatus, jqXHR) {
console.log("start");
if (typeof origCallback === "function") {
origCallback(data, textStatus, jqXHR);
}
console.log("end");
};
};
// store the original AJAX function in a variable before overwriting it
var jqAjax = $.ajax;
$.ajax = function(settings){
// override the callback function, then execute the original AJAX function
settings.success = new SuccessCallback(settings.success);
jqAjax(settings);
};
})();
Now you can simply use $.ajax
as usual:
$.ajax({
url: "test.html",
success: function() {
console.log("will be printed between 'start' and 'end'");
}
});
As far as I know, any of jQuery's AJAX functions (such as $.get()
or .load()
) internally use $.ajax
, so this should work with every AJAX request done via jQuery (I haven't tested this though...).
XMLHttpRequest.prototype
. Note that the following won't work in IE, which uses ActiveXObject
instead of XMLHttpRequest
.
(function(){
// overwrite the "send" method, but keep the original implementation in a variable
var origSend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function(data){
// check if onreadystatechange property is set (which is used for callbacks)
if (typeof this.onreadystatechange === "function") {
// overwrite callback function
var origOnreadystatechange = this.onreadystatechange;
this.onreadystatechange = function(){
if (this.readyState === 4) {
console.log("start");
}
origOnreadystatechange();
if (this.readyState === 4) {
console.log("end");
}
};
}
// execute the original "send" method
origSend.call(this, data);
};
})();
Usage (just like a usual XMLHttpRequest):
var xhr = new XMLHttpRequest();
xhr.open("POST", "test.html", true);
xhr.onreadystatechange = function(){
if (xhr.readyState === 4) {
console.log("will be printed between 'start' and 'end'");
}
};
xhr.send();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With