js实现简单实用的AJAX完整实例

本文实例讲述了js实现简单实用的AJAX的方法。分享给大家供大家参考,具体如下:

//版权归属 WUJXPING
//ajax 1.2
//更新2012-2-20
//1、异步数据加载可以进行加载方式get,post的设定
//2、异步同步模式的属性设定
//3、数据加载自动超时设置
//4、***数据加载事件的添加,通过事件可以进行服务器数据的实时处理
//5、增加回调函数中用户自定义参数this.e
//6、增加ajax反复提交控制,只需将ajax对象定义为全局变量,每次提交都会进行等待上次提交的执行结果
//7、修改数据反复提交时XmlHttp对象被反复创建的问题
//8、修复重大BUG,多个AJAX事件覆盖问题
//服务器数据返回事件
ajax.prototype.ServerEven=function(Func){
  this.callback=new delegate(Func);//实例化
}
//创建异步处理对象
ajax.prototype.CreateXMLHttp=function(){
  if(this.XmlHttp!=null && typeof this.XmlHttp == "object")
    return this.XmlHttp;
  xmlhttpObj = ["Microsoft.XmlHttp","MSXML2.XmlHttp.5.0","MSXML2.XmlHttp.4.0","MSXML2.XmlHttp.3.0","MSXML2.XmlHttp"];
 //根据不同的浏览器创建XMLHttpRequest
 if(window.ActiveXObject){
   for(i=0;i<xmlhttpObj.length;i++){ //选择ie兼容版本
      try{
        this.XmlHttp = new ActiveXObject(xmlhttpObj[i]);
      }catch(err){
        continue;
      }
      if(this.XmlHttp)
        break;
    }
 }
 else if(window.XMLHttpRequest){
  this.XmlHttp=new XMLHttpRequest();
 }
  return this.XmlHttp;
 }
 //开始调用
ajax.prototype.Send=function(){
  if(this.isbusy)//ajax正忙
    return;
  this.isbusy=true;
 var xmlhtml=this.CreateXMLHttp(); //创建对象
  if(xmlhtml==null){
    this.isbusy=false
    if(this.callback!=null)
      this.callback.run("XMLHttpRequest Create Faild!",this.e);
    return;
  }
  var url=this.url;
  var _this=this;
  // 加随机数防止缓存
  if (url.indexOf("?") > 0)
    url += "&randnum=" + Math.random();
  else
    url += "?randnum=" + Math.random();
  xmlhtml.open(this.method,url,this.async);
 xmlhtml.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8;");
  xmlhtml.setRequestHeader("Cache-Control","no-cache");
 xmlhtml.setRequestHeader("Connection","Keep-Alive");
  //开启定时进行超时等待
  var timer=setTimeout(function(){
    //if(xmlhtml.readyState!=4){
    xmlhtml.abort(); //取消本次传输
    _this.isbusy=false;
    if(_this.callback!=null)
      _this.callback.run("send timeout!",_this.e);
    clearTimeout(timer); //关闭定时器
  },this.timeout);
  if(this.async)//异步数据加载时状态变化与事件挂钩
    xmlhtml.onreadystatechange=function(){//接收服务器响应
      if(xmlhtml.readyState==4){//判断是否是完成状态
        if(xmlhtml.status==200){ //判断是否执行成功
          _this.isbusy=false;
          clearTimeout(timer); //关闭定时器
          if(_this.callback!=null)//开始触发服务器事件
            _this.callback.run(xmlhtml,_this.e);
        }
      }
    };
  try{
    xmlhtml.send(this.option);
  }catch(err){
    this.isbusy=false
    clearTimeout(timer); //关闭定时器
    alert(err);
    return;
  }
  if(!this.async){//同步数据加载时数据返回处理
    this.isbusy=false;
    clearTimeout(timer); //关闭定时器
    if(this.callback!=null)
      this.callback.run(xmlhtml,this.e);
  }
 }
 //创建ajax对象
function ajax(url){
  this.method="post";//设置数据提交方式
  this.async=true;//是否进行异步数据加载模式
  this.option="";  //请求的参数
  this.url=url;//请求的Url连接
  this.timeout=1000*60*1;//默认超时时间为1分钟
  this.e=null;//回调事件中用户自定义参数
  this.XmlHttp=null;//接收异步创建的对象防止反复创建
  this.isbusy=false//获取当前ajax的执行状态
  this.callback=null;//声明回调事件
  // 实现委托的类
  delegate=function (func){
   this.arr = new Array(); // 回调函数数组
   this.add = function(func){
    this.arr[this.arr.length] = func;
   };
   this.run = function(sender,e){
    for(var i=0;i<this.arr.length;i++){
     var func = this.arr[i];
     if(typeof func == "function"){
      func(sender,e); // 遍历所有方法以及调用
     }
    }
   }
   this.add(func);
  }
}

更多关于ajax相关内容感兴趣的读者可查看本站专题:《JavaScript中ajax操作技巧总结》及《jquery中Ajax用法总结》

希望本文所述对大家ajax程序设计有所帮助。

(0)

相关推荐

  • jsp+ajax实现无刷新上传文件的方法

    本文实例讲述了jsp+ajax实现无刷新上传文件的方法.分享给大家供大家参考,具体如下: 列表页:selectaddress.jsp js页:ajax_edit.js jsp处理页:editaddress.jsp 上传工具类:UploadUtil.java 思想:由于安全问题,javascript操纵不了文件, 导致ajax不能动态上传文件,所以选择了iframe, 列表页把form表单提交到一个隐式的iframe里面,设置表单的属性 复制代码 代码如下: enctype='multipart/

  • JS基于MSClass和setInterval实现ajax定时采集信息并滚动显示的方法

    本文实例讲述了JS基于MSClass和setInterval实现ajax定时采集信息并滚动显示的方法.分享给大家供大家参考,具体如下: setTimeout 用于延时器,只执行一次. setInterval:用于多次执行. 项目中引用到jquery.timers-1.2.js定时器,并且MSClass做信息定期滚动,每3分钟执行一次,执行三次左右,滚动的次数越来越快,原因在于timers和MSClass都用了setInterval, 都会再次添加一个setInterval,最后导致几个setIn

  • 滑轮滚动到页面底部ajax加载数据配合jsonp实现探讨

    滚动下拉到页面底部加载数据是很多瀑布流网站的做法,那来看看配合jsonp是如何实现的吧,小菜总结记录之用,高手勿喷. 当然本例子采用的是jquery库,后期会做成原生js. 本例的数据调用的是锋利的jquery一书提供的一段json. 首先要先判断页面怎么样才是滚动到底部,也就是scrollTop+window的height是否大于document的height,jquery如下代码: $(window).scrollTop()+$(window).height()>=$(document).h

  • Ajax+js实现异步交互

    一提到异步交互大家就会说ajax,仿佛ajax这个技术已经成为了异步交互的代名词.那下面将研究ajax的核心对象! 利用ajax实现异步交互无非4步: 创建ajax核心对象 与服务器建立连接 向服务器发送请求 接收服务器响应的数据 看似神秘的异步交互当明确这4步后,也许在大家脑海里已经有了初步的思路了 首先我们创建ajax的核心对象,由于浏览器的兼容问题我们在创建ajax核心对象的时候不得考虑其兼容问题,因为要想实现异步交互的后面步骤都基于第一步是否成功的创建了ajax核心对象. functio

  • JavaScript、jQuery与Ajax的关系

    在上篇文章给大家介绍了javascript jquery ajax的小结,今天接着给大家介绍javascript jquery与ajax的关系,感兴趣的朋友一起学习吧 简单总结: 1.JS是一门前端语言. 2.Ajax是一门技术,它提供了异步更新的机制,使用客户端与服务器间交换数据而非整个页面文档,实现页面的局部更新. 3.jQuery是一个框架,它对JS进行了封装,使其更方便使用.jQuery使得JS与Ajax的使用更方便 详细情况: Actually only one of them is

  • 纯js实现瀑布流布局及ajax动态新增数据

    本文用纯js代码手写一个瀑布流网页效果,初步实现一个基本的瀑布流布局,以及滚动到底部后模拟ajax数据加载新图片功能. 缺点: 1. 程序不是响应式,不能实时调整页面宽度: 2. 程序中当新增ajax模拟数据图片后,是将整个页面的所有图片都重新定位一次. 3. 程序是等所有图片加载完成后再读取图片的尺寸,实际中肯定不能这样做. 4. 实际项目中,应该由后台程序给出图片尺寸值,在js代码中直接使用图片的width属性. 本程序思路: html结构: <body> <div id="

  • js+AJAX异步从优酷专辑中采集所有视频及信息

    http://www.jb51.net/article/22031.htm个人觉得不甚满意,因为VB.NET在.NET环境下执行采集,产生的网络连接与正则匹配消耗太大,而我最终的应用是在视频采集提交上,所以就考虑用JS的AJAX+正则表达式来完成这个目标. 以前一直没有系统地学习JS和正则,所以花费的时间比预想的要长,折腾了一个晚上,糊弄出了下面的代码.=..= 代码 复制代码 代码如下: <!-- 夜闻香原创,转载请保留此信息,万分感谢! 博客: http://clso.cnblogs.com

  • 原生JavaScript实现Ajax的方法

    首先为大家分享了原生JavaScript实现Ajax代码,供大家参考,具体内容如下 var getXmlHttpRequest = function() { if (window.XMLHttpRequest) { //主流浏览器提供了XMLHttpRequest对象 return new XMLHttpRequest(); } else if (window.ActiveXObject) { //低版本的IE浏览器没有提供XMLHttpRequest对象 //所以必须使用IE浏览器的特定实现A

  • js HTML5 Ajax实现文件上传进度条功能

    本文实例介绍了js结合HTML5 Ajax实现文件上传进度条功能,分享给大家供大家参考,具体内容如下 1.  lib.js var Host = window.location.host; //--Cookie function setCookie(name,value) { var Days = 30; var exp = new Date(); exp.setTime(exp.getTime() + Days*24*60*60*1000); document.cookie = name +

  • AJAX实现跨域的三种方法(代理,JSONP,XHR2)

    域: 域是WIN2K网络系统的安全性边界.我们知道一个计算机网最基本的单元就是"域",这一点不是WIN2K所独有的,但活动目录可以贯穿一个或多个域.在独立的计算机上,域即指计算机本身,一个域可以分布在多个物理位置上,同时一个物理位置又可以划分不同网段为不同的域,每个域都有自己的安全策略以及它与其他域的信任关系.当多个域通过信任关系连接起来之后,活动目录可以被多个信任域域共享. 由于在工作中需要使用AJAX请求其他域名下的请求,但是会出现拒绝访问的情况,这是因为基于安全的考虑,AJAX只

  • AJAX异步从优酷专辑中采集所有视频及信息(JavaScript代码)

    个人觉得不甚满意,因为VB.NET在.NET环境下执行采集,产生的网络连接与正则匹配消耗太大,而我最终的应用是在视频采集提交上,所以就考虑用JS的AJAX+正则表达式来完成这个目标. 以前一直没有系统地学习JS和正则,所以花费的时间比预想的要长,折腾了一个晚上,糊弄出了下面的代码.=..= 复制代码 代码如下: <!-- 夜闻香原创,转载请保留此信息,万分感谢! 博客: http://clso.cnblogs.com 主页: http://cleclso.cn QQ:315514678 E-ma

随机推荐