我正在尝试在没有jQuery的情况下重现jQuery的函数ajaxComplete和ajaxStart,以便可以在没有库依赖项的任何环境中使用它们(这是一个特殊的用例)。这些功能允许在任何ajax请求之前和之后调用事件侦听器。在我的示例中,我将它们称为preAjaxListener和postAjaxListener。
我正在尝试通过连接到XMLHttpRequest对象并覆盖/装饰open
and 来实现它send
。是的,我知道这很脏。
XMLHttpRequest.prototype.open = (function(orig){
return function(a,b,c){
this._HREF = b; // store target url
return orig.apply(this, arguments); // call original 'open' function
};
})(XMLHttpRequest.prototype.open);
XMLHttpRequest.prototype.send = (function(orig){
return function(){
var xhr = this;
_core._fireAjaxEvents('pre', xhr._HREF); // preAjaxListener fires
var rsc = xhr.onreadystatechange || function(){}; // store the original onreadystatechange if it exists
xhr.onreadystatechange = function(){ // overwrite with custom function
try {
if (xhr.readyState == 4){
_core._fireAjaxEvents('post', xhr._HREF); // postAjaxListneer should fire
this.onreadystatechange = rsc;
}
} catch (e){ }
return rsc.apply(this, arguments); // call original readystatechange function
};
return orig.apply(this, arguments); // call original 'send' function
};
})(XMLHttpRequest.prototype.send);
我不想编写包装器功能来发出ajax请求。我希望能够挂接到页面上任何库(或使用香草js)发出的任何ajax请求。
到目前为止,仅该preAjaxListener
功能有效。我似乎无法弄清楚为什么,但似乎onreadystatechange
从未有人称呼过。任何指导将不胜感激。
工作演示:http :
//jsfiddle.net/_nderscore/QTQ5s/
使用.onreadystatechange
不起作用,因为我正在使用jQuery进行测试,并且jQuery的ajax方法可以操纵并删除该onreadystatechange
属性。
但是,为loadend
IE 添加事件侦听器的方法在所有地方都可以正常工作。对于IE,我改为设置时间间隔-不是最佳解决方案,但它可以满足我的需要。
我只打算将此脚本用于IE8 +和现代浏览器。
XMLHttpRequest.prototype.send = (function(orig){
return function(){
_core._fireAjaxEvents('pre', this._HREF);
if (!/MSIE/.test(navigator.userAgent)){
this.addEventListener("loadend", function(){
_core._fireAjaxEvents('post', this._HREF);
}, false);
} else {
var xhr = this,
waiter = setInterval(function(){
if(xhr.readyState && xhr.readyState == 4){
_core._fireAjaxEvents('post', xhr._HREF);
clearInterval(waiter);
}
}, 50);
}
return orig.apply(this, arguments);
};
})(XMLHttpRequest.prototype.send);
问题内容: 我有一个加载功能,并希望代码在加载时以及完成时将一些html写入div以显示页面。我在ajaxStart和ajaxComplete事件上看到了一些小文章,但是我不确定如何实现它们。 这是我正在考虑使用的jQuery,但是不确定如何在我当前使用的代码中实现… 这是我正在使用的当前jQuery: 问题答案: 如果它是单个div,并且您希望使用加载消息/指示符更新其内容,则可以这样进行: 除
问题内容: 基本上就是这个问题(括号很重要) 问题答案: 并且针对 所有 请求 一起使用 ,在第 一个 同时请求开始时触发,然后在该同时批处理的 最后一个 完成时触发。 因此,假设您一次发出3个请求,在第一个请求开始时触发,在最后一个请求返回时(它们不一定按顺序完成)触发。 这些事件 没有 任何参数,因为它们是针对一批请求的: 并在 每个请求 发送/完成后触发一次。这就是为什么这些处理程序传递参数
问题内容: 在哪个时间使用哪个。 在http://api.jquery.com/上的文档中: 对于ajaxStop(),它表示: 描述:注册所有Ajax请求完成后要调用的处理程序。这是一个Ajax事件。 对于ajaxComplete(),它说: 描述:注册一个在Ajax请求完成时要调用的处理程序。这是一个Ajax事件。 从我可以看到,由于以下原因,ajaxComplete()更加灵活: 无论完成了
本文向大家介绍SQL 创建一个新功能,包括了SQL 创建一个新功能的使用技巧和注意事项,需要的朋友参考一下 示例 本示例创建一个名为FirstWord的函数,该函数接受varchar参数并返回另一个varchar值。
问题内容: 此代码 在我的标记中 这是完整的ajax请求: 即使gif显示为旋转,也永远不会触发警报“开始”。AjaxStop如预期那样被触发。有什么想法吗? 问题答案: 之所以不会被触发,是因为直到ajax请求执行完 之后 (直到被调用时为止) , 您的处理程序才被注册。在被注册后为好,但 之前 的请求完成,所以当它回来就迷上了运行。 要解决此问题,请 在 首次致电 之前 将其移动: 更新:从j
创建新的Arraylist(如第一种方法)与创建第二种方法之间的区别是什么?在创建一个时,您考虑了什么?