2010-11-21 2 views
2

Я хочу изменить функцию отправки XMLHttpRequest, чтобы вызвать функцию перед выполнением запроса и после завершения запроса. Вот то, что я до сих пор:Функция изменения на прототипе javascript

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; 
} 

Однако, я делаю что-то здесь не так, потому что, как только он попадает в oldSend() вызов, он никогда не возвращается или запускает onreadystatechange событие. Поэтому я должен делать что-то не так. Есть идеи? Я поставил точку останова и получает удар просто прекрасно, когда я называю это:

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

Так моя новая функция вызывалась. Я думаю, просто не знаю, как вызвать старую функцию. Любые идеи о том, как исправить этот код, чтобы на самом деле был сделан запрос Ajax и был вызван мой новый callback?

Примечание: Я знаю события JQuery, которые по существу делают это. Но я делаю это, поэтому я могу заставить его работать с любым вызовом Ajax (Mootools, GWT и т. Д.). Я просто пытаюсь проверить его с помощью JQuery.

ответ

4

Необходимо использовать функции old в контексте this.

Например: oldSend.call (это)

+0

так бы я это сделать: 'oldSend.call (это, аргументы [0]);' или есть лучший способ, где я могу просто передать массив аргументов ? Таким образом, исключение оператора if. – Joel

+2

Вы можете использовать '.apply()', который принимает массив как второй параметр. –

+0

Спасибо, отлично работает! – Joel

Смежные вопросы