转载 Xmlhttprequest对象池
2019独角兽企业重金招聘Python工程师标准>>>
在ajax应用中,通常一个页面要同时发送多个请 求,如果只有一个XMLHttpRequest对象,前面的请求还未完成,后面的就会把前面的覆盖掉,如果每次都创建一个新的 XMLHttpRequest对象,也会造成浪费。解决的办法就是创建一个XMLHttpRequset的对象池,如果池里有空闲的对象,则使用此对象, 否则将创建一个新的对象。
下面是我最近写的一个简单的类:
/**
* XMLHttpRequest Object Pool
*
* @author legend <legendsky@hotmail.com>
* @link http://www.ugia.cn/?p=85
* @Copyright www.ugia.cn
*/
var XMLHttp = {
_objPool: [],
_getInstance: function ()
{
for (var i = 0; i < this._objPool.length; i ++)
{
if (this._objPool[i].readyState == 0 || this._objPool[i].readyState == 4)
{
return this._objPool[i];
}
}
// IE5中不支持push方法
this._objPool[this._objPool.length] = this._createObj();
return this._objPool[this._objPool.length - 1];
},
_createObj: function ()
{
if (window.XMLHttpRequest)
{
var objXMLHttp = new XMLHttpRequest();
}
else
{
var MSXML = ['MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP', 'Microsoft.XMLHTTP'];
for(var n = 0; n < MSXML.length; n ++)
{
try
{
var objXMLHttp = new ActiveXObject(MSXML[n]);
break;
}
catch(e)
{
}
}
}
// mozilla某些版本没有readyState属性
if (objXMLHttp.readyState == null)
{
objXMLHttp.readyState = 0;
objXMLHttp.addEventListener("load", function ()
{
objXMLHttp.readyState = 4;
if (typeof objXMLHttp.onreadystatechange == "function")
{
objXMLHttp.onreadystatechange();
}
}, false);
}
return objXMLHttp;
},
// 发送请求(方法[post,get], 地址, 数据, 回调函数)
sendReq: function (method, url, data, callback)
{
var objXMLHttp = this._getInstance();
with(objXMLHttp)
{
try
{
// 加随机数防止缓存
if (url.indexOf("?") > 0)
{
url += "&randnum=" + Math.random();
}
else
{
url += "?randnum=" + Math.random();
}
open(method, url, true);
// 设定请求编码方式
setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
send(data);
onreadystatechange = function ()
{
if (objXMLHttp.readyState == 4 && (objXMLHttp.status == 200 || objXMLHttp.status == 304))
{
callback(objXMLHttp);
}
}
}
catch(e)
{
alert(e);
}
}
}
};
示例:
<script type="text/javascript" src="xmlhttp.js"></script>
<script type="text/javascript">
function test(obj)
{
alert(obj.statusText);
}
XMLHttp.sendReq('GET', 'http://www.ugia.cn/wp-data/test.htm', '', test);
XMLHttp.sendReq('GET', 'http://www.ugia.cn/wp-data/test.htm', '', test);
XMLHttp.sendReq('GET', 'http://www.ugia.cn/wp-data/test.htm', '', test);
XMLHttp.sendReq('GET', 'http://www.ugia.cn/wp-data/test.htm', '', test);
alert('Pool length:' + XMLHttp._objPool.length);
</script>
demo 下载xmlhttp.js
Permalink
50 Comments »
s5s5 said,
legend said,
danielking said,
December 23, 2005 @ 9:12 am
legend said,
源代码里有中文的注释,是ansi的,如果你的网站或ie下选择编码为UTF-8,可能会导致错误,你把你ie的编码改成gb2312看看,或者去掉文件里的中文注释
nickfan said,
andot said,
legend said,
andot said,
野马 said,
legend said,
hzy said,
December 31, 2005 @ 1:11 pm
hzy said,
December 31, 2005 @ 2:09 pm
legend said,
hzy said,
December 31, 2005 @ 3:32 pm
hzy said,
January 12, 2006 @ 12:04 pm
FindRain said,
January 16, 2006 @ 10:29 am
mincyw said,
January 17, 2006 @ 7:12 pm
maltose said,
January 19, 2006 @ 8:29 pm
longbill said,
Huangl said,
April 29, 2006 @ 12:46 am
legend said,
没有测试过也没有经验数据,只是认为ie每次创建activex对象应该是有些花销的。我这篇文章的主要目的并不是为了节能,而是为了并发。
Huangl said,
May 10, 2006 @ 1:59 am
??不创建一个池,就不能并发了么?
还有,xmlhttprequest对象的生命周期有多长?每次从池中取出一个用就可以么?
不好意思,新手,不明白的太多,呵呵。legend said,
不创建也可以并发,但每次得创建一个新的xmlhttprequest对象。我创建池的目的,就是为了能够重复利用已经创建的对象。
nada said,
May 12, 2006 @ 7:34 pm
Zhang-Zi said,
这东西不错。那个IE的Ajax缓存情况以前我遇到过,弄了我好久,到后来才发现IE的ajax会缓存。要是早看到你这篇文章就好了
An said,
June 6, 2006 @ 7:22 am
diaodiao said,
November 5, 2006 @ 5:43 pm
diaodiao said,
November 5, 2006 @ 8:08 pm
海南马自达 said,
December 13, 2006 @ 3:05 pm
Alan said,
December 31, 2006 @ 11:31 am
legend said,
調用xmlhttprequest就發送了,然後下一次調用的時候,如果前面的都在使用中,會自動創建一個新xmlhttp對象。如果有空閒的對象才會直接使用它。
這個池子並不是爲了效率,而是如果是單一的xmlhttprequest對象,重復調用的話,如果前一個正在發送,後面的就會覆蓋這個對象,那我們的請求就丟失了。
streetsmart said,
kevin said,
April 21, 2007 @ 6:55 pm
使用中发现了一个问题。当我读取A完毕,并正确显示之后,点B,读取B的内容的时候,B可以正确显示,而A又会重新进入读取状态,而且始终无法完成,即staut始终=0。这是什么呢?怎么解决?
kevin said,
April 21, 2007 @ 6:59 pm
legend said,
huxishengming said,
May 5, 2007 @ 3:58 pm
objXMLHttp.readyState = 0;
在ff中这样为对象添加一个属性可以吗?不是应该用addAttribute吗?zeroone said,
May 12, 2007 @ 12:08 pm
毛毛虫 said,
May 22, 2007 @ 9:08 am
legend said,
毛毛虫 said,
May 22, 2007 @ 9:26 am
毛毛虫 said,
May 22, 2007 @ 9:27 am
毛毛虫 said,
May 22, 2007 @ 9:28 am
毛毛虫 said,
May 22, 2007 @ 9:30 am
毛毛虫 said,
May 22, 2007 @ 9:48 am
Jeffy said,
August 31, 2007 @ 10:40 am
Jeffy said,
August 31, 2007 @ 10:42 am
hongyu said,
August 31, 2007 @ 10:52 am
胡杨 said,
October 24, 2007 @ 8:34 pm
能还能逐行的解释一下。
刚刚接触xmlhttprequest这方面的知识。
切盼
我的email:micenote@yahoo.com.cnirene said,
December 12, 2007 @ 2:17 pm
破曉之陽 said,
December 28, 2007 @ 12:33 am
转载于:https://my.oschina.net/u/1246814/blog/225353
转载 Xmlhttprequest对象池相关推荐
- [转]建一个XMLHttpRequest对象池
在ajax应用中,通常一个页面要同时发送多个请求,如果只有一个XMLHttpRequest对象,前面的请求还未完成,后面的就会把前面的覆盖掉,如果每次都创建一个新的XMLHttpRequest对象,也 ...
- java对象工厂池_[转载]Java对象池技术的原理及其实现
作者:汪永好 出处:计算机与信息技术 责任编辑: 方舟 [ 2006-11-25 07:00 ] 摘 要 :本文在分析对象池技术基本原理的基础上,给出了对象池技术的两种实现方式.还指出了使用对象池技术 ...
- 建一个XMLHttpRequest对象池
在ajax应用中,通常一个页面要同时发送多个请 求,如果只有一个XMLHttpRequest对象,前面的请求还未完成,后面的就会把前面的覆盖掉,如果每次都创建一个新的 XMLHttpRequest对象 ...
- ajax(判断浏览器创建xmlhttprequest对象),XMLHTTPRequest对象的创建与浏览器的兼容问题...
MLHttpRequest 对象是AJAX功能的核心,要开发AJAX程序必须从了解XMLHttpRequest 对象开始. 了解XMLHttpRequest 对象就先从创建XMLHttpRequest ...
- Ajax异步XMLHttpRequest对象
示例Ajax: <%@ page language="java" contentType="text/html; charset=utf-8"pageEn ...
- Java 程序优化之对象池
对象池概念: 如果一个类被频繁请求使用,那么不必每次都生成一个实例,可以将这个类都一些实例保存到一个"池"中,待需要使用的时候直接从"池"中获取.这个" ...
- cocos对象池的使用
enemy.js cc.Class({extends: cc.Component,properties: {enemySpeed: 0, //设置加速度 },//初始化当前节点的y坐标init: fu ...
- Delphi对象池MyObjectPool.pas
对象池一般在服务端使用,所以稳定性是第一的. 欢迎提意见 unit uMyObjectPool;interfaceusesSyncObjs, Classes, Windows, SysUtils;ty ...
- Netty 高性能之道 - Recycler 对象池的复用
前言 我们知道,Java 创建一个实例的消耗是不小的,如果没有使用栈上分配和 TLAB,那么就需要使用 CAS 在堆中创建对象.所以现在很多框架都使用对象池.Netty 也不例外,通过重用对象,能够避 ...
最新文章
- 关于java.util.LinkedHashMap cannot be cast to ......的解决办法
- 用 AI 分析蒙娜丽莎的微笑,情绪分析认为她没那么高兴
- centos7 yum 错误 This system is not registered with an entitlement server
- 深入浅出:Linux设备驱动之字符设备驱动
- 线性表(一)——顺序表
- 一级计算机word试题及答案,计算机一级考试试题及答案Word文档..doc
- matlab 工业相机 曝光时间_机器视觉入门——光源相机镜头
- 企业实战_14_MyCat跨分片查询_全局表
- Fiddler抓包工具之Filters(过滤器)进行会话过滤
- Kotlin — 运行代码片段(以轻量级方式编写和无需创建整个应用程序的方法)
- 2021桂花开得真晚,晚了将近一个月
- 【图像隐写】基于matlab FFT数字水印嵌入【含Matlab源码 1670期】
- 极客大学架构师训练营 大数据 GFS、MapReduce、BigTable,Hadoop HDFS Yarn HiveQL 第12次作业
- 基于热传导方程的高温作业专用服装设计(三)
- 这些mac软件可以提高办公效率
- 注册cad中文件未找到html,acad(2014CAD出现未找到acad文件 求解)
- 验证码Kaptcha的使用
- diy nas配置推荐2020_廉价NAS方案,手把手教你用淘汰主机安装黑群NAS
- 圆形数字时钟同时显示数字时钟、日期和星期特效
- 自己实现SDIO wifi Marvell8801/Marvell88w8801驱动 介绍(一) ---- 芯片介绍