2010-11-21 29 views
2

XMLHttpRequest gönderme işlevini değiştirmek istiyorum, böylece istek yapılmadan ve istek tamamlandıktan sonra bir işlev çağrılır.Javascript prototipindeki işlevi değiştirme

var oldSend = XMLHttpRequest.prototype.send; 
XMLHttpRequest.prototype.send = function() { 
    //this never gets called 
    oldOnReady = this.onreadystatechange; 
    this.onreadystatechange = function() { 
     oldOnReady(); 
     ajaxStopped(); 
    } 

    ajaxStarted(); 

    // according to http://www.w3.org/TR/XMLHttpRequest/ 
    // there's only ever 0 or 1 parameters passed into this method 
    if(arguments && arguments.length > 0) { 
     oldSend(arguments[0]); //gets to here, calls this method, then nothing happens 
    } else { 
     oldSend(); 
    } 
} 

function ajaxStarted() { 
    ajaxCount++; 
    document.getElementById("buttonClicky").innerHTML = "Count: " + ajaxCount; 
} 

function ajaxStopped() { 
    $("#isRunning")[0].innerHTML = "stopped"; 
    ajaxCount--; 
    document.getElementById("buttonClicky").innerHTML = "Count: " + ajaxCount; 
} 

Ancak oldSend() çağrıyı vurur kez asla geri döner veya onreadystatechange olayı tetikler çünkü burada yanlış bir şey yapıyorum: İşte ben bugüne kadar ne var. Bu yüzden burada yanlış birşeyler yapmalıyım. Herhangi bir fikir? Bir kesme noktası ayarlamak ve bu çağırdığınızda gayet çarpıyor:

$.ajax({ 
    type: "GET", 
    url: "file.txt", 
    success: function(result) { 
        //this never gets called 
     document.getElementById("myDiv").innerHTML = result; 
    } 
}); 

Yani benim yeni işlev

denir oluyor. Sanırım eski işlevi nasıl arayacağımı bilmiyorum. Bu kodun nasıl düzeltileceğine dair herhangi bir fikir Ajax İsteği gerçekten yapılır ve yeni geriçağırım çağrılır?

Not: Aslında bunu yapan JQuery olaylarının farkındayım. Ama bunu yapıyorum, böylece herhangi bir Ajax çağrısı ile çalışabilirim (Mootools, GWT, vb.). Sadece Jquery ile test etmek için yaşıyorum.

cevap

4

this kapsamında old işlevlerini çağırmanız gerekir.

Örnek: oldSend.call (bu)

+0

bu yüzden bu yapacağını: 'oldSend.call (bu, bağımsız değişkenler [0]);' ya da sadece argümanlar dizi geçebilir daha iyi bir yolu yoktur ? Böylece if deyimini ortadan kaldırarak. – Joel

+2

İkinci parametre olarak bir dizi alan .apply() 'işlevini kullanabilirsiniz. –

+0

Teşekkürler, harika çalışıyor! – Joel