Я хочу изменить функцию отправки 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.
так бы я это сделать: 'oldSend.call (это, аргументы [0]);' или есть лучший способ, где я могу просто передать массив аргументов ? Таким образом, исключение оператора if. – Joel
Вы можете использовать '.apply()', который принимает массив как второй параметр. –
Спасибо, отлично работает! – Joel