2012-08-17 17 views
5

Ben ajaxsend olay üzerine başarı işlevi üzerine çalışıyorum ama burada doesnt iş koddur konsol, ancak başarı üzerine başlangıç ​​ve son hata ayıklama msges .. görülemez ..JQuery ajaxSend olay aracılığıyla başarı işlevi üzerine nasıl

Neyi yanlış yapıyorum?

+0

İlgili: http://stackoverflow.com/questions/293668/jquery-ajax-prevent-callback-from-running – pimvdb

+0

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

+0

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

cevap

-1

Sen neye ihtiyacınız gerçekleştirmek için kapanışları kullanabilirsiniz: Eğer başarmak için çalışıyoruz ne

function closure(handler) { 
    return function(ev, xhr, options) { 
     console.log("start"); 
     handler(ev, xhr, options); 
     console.log("stop"); 
    } 
} 

$(document).ajaxSend(closure(function(ev, xhr, options) { 
    console.log("hello"); 
})); 
+0

Bu, geri bildirim işlevinin yerine yazılmadığı şekilde çalışmamaktadır! "Kapat" işlevinin herhangi bir etkisi yoktur; 'console.log ('start/end')' 'ajaxSend''e de taşındı.Temel olarak "çözümün" sadece kod gizleme ... – Aletheios

+0

Açıkçası yazar niyetini yanlış anladım, bunun için üzgünüm. $ .get ve $ .load'a gelince, burada görüldüğü gibi $ .ajax'i dahili olarak kullanıyorlar: https://github.com/jquery/jquery/blob/master/src/ajax.js – prot

6

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(); 
+0

Ne yaparsınız? jquery ajax istekleri için? – ciochPep

+0

Yukarı bakın, cevabımı düzenledim ... Ama sanırım daha fazlası var, belki de bunun için ayrı bir soru açmalısınız. – Aletheios