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请求并调用我的新回调?
注:我知道基本上这样做的JQuery事件。但是我正在这样做,所以我可以使用它来处理任何Ajax调用(Mootools,GWT等)。我正在用Jquery测试它。
所以将我这样做:'oldSend.call(此,参数[0]);'或是有更好的方法,我可以只是传递参数阵列中?从而消除了if语句。 – Joel 2010-11-21 01:55:42
你可以使用'.apply()',它将一个数组作为第二个参数。 – 2010-11-21 01:59:03
谢谢,效果很棒! – Joel 2010-11-21 03:17:54