Изменить функцию на прототипе JavaScript - PullRequest
2 голосов
/ 21 ноября 2010

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

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 действительно выполнялся и вызывался мой новый обратный вызов?

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

1 Ответ

4 голосов
/ 21 ноября 2010

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

Например: oldSend.call (this)

...