在页面上使用ActiveXObject的代价是很大的,如果我们的无刷新页面使用xmlhttp技术,我们或许需要频繁的建立xmlhttp对象,当然我们也可以使用全局变量来cache一个xmlhttp对象实例。但是这样的方法适合于同步方式xmlhttp通信,而对于异步方式xmlhttp通信将会出现问题。由于没有了进程的堵塞,用户可能再次调用同一个xmlhttp实例,如果这时前一个通信未完成,那么就失败了。

建立一个pool来管理页面上的xmlhttp对象实例,最明显的好处就是不会再创建冗余对象,同时也不会出现多个操作在同一个工作的xmlhttp实例上被调用的情况。

具体实现,我们使用一个Array作为pool来存储已创建的xmlhttp对象实例,然后每次调用从pool中去取一个实例。xmlhttp实例通讯完毕后我们不用做任何处置,因为它自身的readyState属性可以标识出它是否可用,如果当时没有空闲的xmlhttp实例,且pool中的实例数小于m_MaxPoolLength,那么就创建一个新的实例并放入pool中。pool的实现代码如下:

__XmlHttpPool__源码#region __XmlHttpPool__源码
var __XmlHttpPool__ =
{
    m_MaxPoolLength : 10,
    m_XmlHttpPool : [],
    
    __requestObject : function()
    {
        var xmlhttp = null;
        var pool = this.m_XmlHttpPool;
        for ( var i=0 ; i < pool.length ; ++i )
        {
            if ( pool[i].readyState == 4 || pool[i].readyState == 0 )
            {
                xmlhttp = pool[i];
                break;
            }
        }
        if ( xmlhttp == null )
        {
            return this.__extendPool();
        }
        return xmlhttp;
    },
    
    __extendPool : function()
    {
        if ( this.m_XmlHttpPool.length < this.m_MaxPoolLength )
        {
            var xmlhttp = null;
            try
            {
                xmlhttp = new ActiveXObject('MSXML2.XMLHTTP');
            }
            catch(e)
            {
                try
                {
                    xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
                }
                catch(e2) {}
            }
            if ( xmlhttp )
            {
                this.m_XmlHttpPool.push(xmlhttp);
            }
            return xmlhttp;
        }
    },
    
    GetRemoteData : function(url, callback)
    {
        this.__receiveRemoteData(url, callback, 'GET', null);
    },
    
    PostRemoteData : function(url, callback, data)
    {
        this.__receiveRemoteData(url, callback, 'POST', data);
    },
    
    __receiveRemoteData : function(url, callback, httpmethod, data)
    {
        var xmlhttp = this.__requestObject();
        if ( !xmlhttp )
        {
            return null;
        }
        xmlhttp.open(httpmethod, url, true);
        xmlhttp.onreadystatechange = function()
        {
            if ( xmlhttp.readyState == 4 || xmlhttp.readyState == 'complete' )
            {
                callback(xmlhttp.responseText);
            }
        };
        xmlhttp.send(data);
    }
};
 #endregion

__XmlHttpPool__提供了两个方法来和服务器通信,一个使用'GET'方法,一个使用'POST'方法,使用它们非常简单,__XmlHttpPool__.GetRemoteData(url, callback)或__XmlHttpPool__.PostRemoteData(url, callback, data)。其中url是服务器地址,callback是处理返回数据(responseText)的回调函数。比如:

<script language="javascript">

__XmlHttpPool__.PostRemoteData(url, Render, 'abc');

function Render(string)
{
    if ( string )
    {
        txbContent.value += string + '/r/n';
    }
}

</scirpt>
<textarea rows="40" style="width:100%" id="txbContent"></textarea>

构建一个pool来管理无刷新页面的xmlhttp对象相关推荐

  1. iOS实现一个包含若干页面和子页面的“打卡”App

    iOS实现一个包含若干页面和子页面的"打卡"App 开发环境 Mac OS Objective-C Xcode 实验目的 学习使用纯代码进行UI布局 学习TableView,UIC ...

  2. github 首页 html,GitHub - merrier/github-html-preview: 一个可以直接预览html页面的chrome插件...

    Github HTML Preview 一个可以直接预览html页面的chrome插件 Github HTML Preview provide a quick way to preview the h ...

  3. 用Flutter构建一个 视频通话联系人管理应用

    用Flutter构建一个 视频 / 通话 / 联系人管理 应用 这是编程务实的第三个实验, 要完成一个简单的拨号器.在此需求基础上,我用Flutter添加了一些全新的功能,包括视频通话,观众视角通话, ...

  4. 用Atlas来实现一个基于AJAX的无刷新Chatroom

    Atlas是微软提供的一个AJAX工具包,封装了实现AJAX的所需的Java Script,使用起来非常简单,可以直接调用Web Service方法,然后通过Asynchronous Call的方式回 ...

  5. VuePress构建一个文档管理网站

    序言 目前无论笔记还是项目文档,大部分我都会通过 Markdown来记录,并且大部分文档写完都只存在自己电脑上,每次查找起来都需要耗费一些时间 自己的写的一部分技术教程由于初次记录时了解知识不多,内容 ...

  6. 不刷新页面的tab_SwiftUI小技巧之如何解决Tab切换后页面重置和List刷新bug

    SwiftUI的tabview非常好用,简单几行就能构建一套基于Tab的App.但是SwiftUI目前tabview存在一个小bug,当tab切换时内部中的list或NavigationLink将会重 ...

  7. 防止恶意刷新页面的Java实现

    在很多对安全性要求较高的项目中,需要提供至少一种对整个项目的安全控制方案,常用的比如身份认证.访问控制.安全审计等等.由于设计不合理而导致的安全问题可能会给项目带来非常大的隐患,正是因为如此,安全问题 ...

  8. java中刷新页面的js,[Java教程]js页面刷新之实现框架内外刷新(整体、局部)

    [Java教程]js页面刷新之实现框架内外刷新(整体.局部) 0 2016-10-12 12:00:56 这次总结的是框架刷新: 框架内外的按钮均可以定义网页重定向, 框架内部页面的按钮可以实现局部刷 ...

  9. 不刷新页面的tab_现代 Web 页面开发流程

    通常来说,Web页面开发的流程大致是这样的:设计师(设计师不是美工,就像程序员不是码农一样)提供设计稿,通常是图片格式.然后前端的开发人员(在ThoughtWorks我们称之为UI Dev)来手工的将 ...

  10. C# Asp.net 中的Treeview 点击不刷新页面的

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="huozhu.aspx.cs&q ...

最新文章

  1. Vim对中文编码的支持[转]
  2. Using string literals in ref attributes is deprecated
  3. php 回复id同过session 任意获取id不通过a,PHP会话ID相同但变量丢失
  4. 图书查找java_java第三季第一章:查找图书信息实现
  5. 八十三、Eureka实现相互注册
  6. 伺服怎么接单相220伏_乐利网带你认识伺服电机及工作原理
  7. “一键删除中国App”应用海外走红,下载量破500万!谷歌:我先把你删除了
  8. qq消息服务器延时,QQ聊天消息丢失或延迟的原因分析
  9. nginx下根据指定路由重定向
  10. 16位顶尖对冲基金大佬:畅谈量化投资的下个10年!
  11. 软考网络规划设计师备考经验分享
  12. 激光导航技术是如何实现的?
  13. 修复下载后已发生损坏的压缩包(.rar)文件
  14. 3、RDA8910(4GCAT1)CSDK二次开发:GPIO输入详解
  15. 啦啦啦啦啦_开放组织读书俱乐部:啦啦队长如何设定方向
  16. 提问的智慧-如何明智到找到想要的答案
  17. 【相机】(2)——WebView中打开相机、文件选择器的问题和解决方法
  18. 大数据应用统一集成平台CDAP简介
  19. 大四毕业生想要在职考研
  20. android程序如何滤波,android – 卡尔曼滤波器:如何使用它没有“状态转换模型”?...

热门文章

  1. 【用电量预测】基于matlab SVM用电量预测【含Matlab源码 103期】
  2. 【车间调度】基于matlab遗传算法求解车间调度问题【含Matlab源码 070期】
  3. 【气动学】基于matlab内弹道【含Matlab源码 057期】
  4. SPSS反向题处理(图文+数据集)【SPSS 011期】
  5. ideal pom文件安装到maven库中_不装 maven 直接使用 IntelliJ 的插件来把本地 jar 包加入到 maven 仓库...
  6. 边缘计算中高效ML的EEoI
  7. matlab fullfile函数
  8. Windows电脑安装Linux系统的方法-Ubuntu版
  9. linux6.5禁用防火墙,Centos6.5,Centos7分别关闭selinux和防火墙
  10. HTML5标准学习 – 简介