ajaxSend
ile yapılamaz. Sorun, ajaxSend
görünüşte, orijinal xhr
ve options
nesnelerinin bir kopyasıyla çalıştığıdır, bu nedenle değişikliklerin herhangi bir etkisi olmayacaktır. Kolayca aşağıdaki kodla bu test edebilirsiniz: Yani başarı geri aramalar üzerine yazmak ajaxSend
kullanamazsınız
$(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"); }
});
.
// 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);
};
})();
Şimdi her zamanki gibi $.ajax
kullanabilirsiniz::
$.ajax({
url: "test.html",
success: function() {
console.log("will be printed between 'start' and 'end'");
}
});
Bildiğim kadarıyla jQuery'nin AJAX fonksiyonları, herhangi bildiği gibi (örneğin Bunun yerine, jQuery'nin AJAX işlevini "kesmek" zorunda kalacak veya .load()
) dahili olarak $.ajax
'u kullanın, bu yüzden jQuery aracılığıyla yapılan her AJAX isteğinde çalışılmalıdır (bunu test etmedim ...). Böyle
şey de
XMLHttpRequest.prototype
hack tarafından "saf" JavaScript ile çalışmalıdır. Aşağıdakiler,
XMLHttpRequest
yerine
ActiveXObject
kullanan IE'de çalışmaz. (Sadece bir olağan XMLHttpRequest gibi)
(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);
};
})();
Kullanımı:
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();
İlgili: http://stackoverflow.com/questions/293668/jquery-ajax-prevent-callback-from-running – pimvdb
sayesinde ama bu soruya cevap vermiyor, ajaxComplete tarayıcının HTTP yanıtını aldıktan sonra tetikliyor, HTTP isteğinden önce tetikleyen ajaxSend'i soruyorum. – ciochPep
Haklısınız. Sadece geri aramaların çalıştırılmaya zorlandığını ve bunu engelleyemeyeceğinizi söyleyen cevaba işaret ediyordum. Tam olarak senin sorunun değil; Ben de bir çözümle ilgileniyorum. – pimvdb