实例讲解使用原生JavaScript处理AJAX请求的方法


Posted in Javascript onMay 10, 2016

Ajax 是异步的JavaScript和XML的简称,是一种更新页面某部分的机制。它赋予了你从服务器获取数据后,更新页面某部分的权力,从而避免了刷新整个页面。另外,以此方式实现页面局部更新,不仅能有效地打造流畅的用户体验,而且减轻了服务器的负载。

下面是对一个基本的 Ajax 请求进行剖析:

var xhr = new XMLHttpRequest();
xhr.open('GET', 'send-ajax-data.php');
xhr.send(null);

在这里, 我们创建了一个能向服务器发出 HTTP 请求的类的实例。然后调用其 open 方法,其中第一个参数是 HTTP 请求方法,第二个参数是请求页面的 URL。最后,我们调用参数为 null 的 send 方法。假如使用 POST 请求方法(这里我们使用了 GET),那么 send 方法 的参数应该包含任何你想发送的数据。

下面是我们如何处理服务器的响应:

xhr.onreadystatechange = function(){
 var DONE = 4; // readyState 4 代表已向服务器发送请求
 var OK = 200; // status 200 代表服务器返回成功
 if(xhr.readyState === DONE){
  if(xhr.status === OK){
   console.log(xhr.responseText); // 这是返回的文本
  } else{
   console.log("Error: "+ xhr.status); // 在此次请求中发生的错误
  }
 }
}

onreadystatechange 是异步的,那么这就意味着它将可在任何时候被调用。这种类型的函数被称为回调函数——一旦某些处理完成后,它就会被调用。在此案例中,这个处理发生在服务器。

示例

便捷的 Ajax 方法也是不少人依赖 jQuery 的原因,但实际上原生 JavaScript 的 Ajax api 也很强大,并且基本的使用在各个浏览器中的差异不大,因此完全可以自行封装一个 Ajax 对象,下面是封装好的 Ajax 对象:

// Ajax 方法
 
// 惰性载入创建 xhr 对象
 
function createXHR(){
 
 if ( 'XMLHttpRequest' in window ){
 
 
  createXHR = function(){
   return new XMLHttpRequest();
  };
 
 } else if( 'ActiveXObject' in window ){
 
  createXHR = function(){
 
   return new ActiveXObject("Msxml2.XMLHTTP");
  };
 
 } else {
 
  createXHR = function(){
   throw new Error("Ajax is not supported by this browser");
  };
 
 }
 
 return createXHR();
 
}
 
// Ajax 执行
 
function request(ajaxData){
 
 var xhr = createXHR();
 
 ajaxData.before && ajaxData.before();
 
 // 通过事件来处理异步请求
 xhr.onreadystatechange = function(){
 
  if( xhr.readyState == 4 ){
 
   if( xhr.status == 200 ){
 
    if( ajaxData.dataType == 'json' ){
 
     // 获取服务器返回的 json 对象
     jsonStr = xhr.responseText;
     json1 = eval('(' + jsonStr + ')'),
     json2 = (new Function('return ' + jsonStr))();
     ajaxData.callback(json2);
     // ajaxData.callback(JSON.parse(xhr.responseText)); // 原生方法,IE6/7 不支持
 
    } else
 
     ajaxData.callback(xhr.responseText);
 
   } else {
 
    ajaxData.error && ajaxData.error(xhr.responseText);
   }
  }
 };
 
 // 设置请求参数
 xhr.open(ajaxData.type, ajaxData.url);
 
 if( ajaxData.noCache == true ) xhr.setRequestHeader('If-Modified-Since', '0');
 
 if( ajaxData.data ){
 
  xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
  xhr.send( ajaxData.data );
 
 } else {
? ?  
  xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
  xhr.send( null );
 }
 
 return xhr;
}
 
function post(ajaxData){
 
 ajaxData.type = 'POST';
 
 var _result = request(ajaxData);
 
 return _result;
}
 
function get(ajaxData){
 
 ajaxData.type = 'GET';
 
 ajaxData.data = null;
 
 var _result = request(ajaxData);
 
 return _result;
}

下面给出一个使用例子:

index.html

<!DOCTYPE HTML>
<html lang="zh-CN">
<head>
 <meta charset="UTF-8">
 <title>原生 JavaScript 实现 Ajax</title>
 <link rel="stylesheet" type="text/css" media="all" href="./common/common.css" />
 <style>
  #content {text-align: center; font-family: 'lucida Grande', 'Microsoft Yahei'}
  #content .btn_ctr {display: block; width: 120px; height: 30px; margin: 0 auto 20px; background: #53a7bb; color: #fff; font-weight: bold; font-size: 14px; line-height: 30px; text-decoration: none;
   border-radius: 4px;
  }
  #test {width: 280px; height: 130px; margin: 0 auto; padding: 15px; background: #fff; border-radius: 4px; text-align: left; }
 </style>
</head>
<body>
 
 <div id="header">
  <div id="header-content">
   <div id="header-inside">
    <p class="go-to-article"><a href="http://kayosite.com/css3-animation.html" title="打开原文" target="_blank" >Back To Article</a></p>
    <p class="go-to-blog"><a href="http://kayosite.com" title="进入我的博客 Kayo's Melody" target="_blank" >My Blog</a></p>
    <p class="copyright">Demo By Kayo © Copyright 2011-2013</p>
   </div>
   <h1>CSS3 Animation</h1>
  </div>
 </div>
 
 <div id="content">
  <a class="btn_ctr" href="javascript:;" onclick="get({url: './ajax.html', callback: function(out){document.getElementById('test').innerHTML = out;}})">Ajax 获取内容</a>
 
  <div id="test"></div>
 </div>
  
 <script>
  // Ajax 方法,这里不在重复列出
 </script>
</body>
</html>
ajax.html
<!DOCTYPE HTML>
<html lang="zh-CN">
<head>
 <meta charset="UTF-8">
 <title>ajax</title>
</head>
<body>
 <p>成功获取到这段文本</p>
</body>
</html>

具体的效果可以浏览完整 Demo 。

Javascript 相关文章推荐
jQuery Div中加载其他页面的实现代码
Feb 27 Javascript
jquery.autocomplete修改实现键盘上下键自动填充示例
Nov 19 Javascript
js控制input输入字符解析
Dec 27 Javascript
javascript中Function类型详解
Apr 28 Javascript
js for循环倒序输出数组元素的实例
Mar 01 Javascript
详解JS模块导入导出
Dec 20 Javascript
webpack vue 项目打包生成的文件,资源文件报404问题的修复方法(总结篇)
Jan 09 Javascript
vue iview组件表格 render函数的使用方法详解
Mar 15 Javascript
Vue+axios+WebApi+NPOI导出Excel文件实例方法
Jun 05 Javascript
Vue的路由及路由钩子函数的实现
Jul 02 Javascript
JS操作Fckeditor的一些常用方法(获取、插入等)
Feb 19 Javascript
vue3.0中友好使用antdv示例详解
Jan 05 Vue.js
深入剖析JavaScript:Object类型
May 10 #Javascript
JavaScript的React Web库的理念剖析及基础上手指南
May 10 #Javascript
快速解决Canvas.toDataURL 图片跨域的问题
May 10 #Javascript
jQuery事件的绑定、触发、及监听方法简单说明
May 10 #Javascript
网页前端登录js按Enter回车键实现登陆的两种方法
May 10 #Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【二】
May 10 #Javascript
JS实现登录页面记住密码和enter键登录方法推荐
May 10 #Javascript
You might like
主流PHP框架的优缺点对比分析
2014/12/25 PHP
Redis使用Eval多个键值自增的操作实例
2016/11/04 PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
2017/11/24 PHP
JavaScript之HTMLCollection接口代码
2011/04/27 Javascript
IE下JS读取xml文件示例代码
2013/08/05 Javascript
Node.js模拟浏览器文件上传示例
2014/03/26 Javascript
JS实现鼠标经过好友列表中的好友头像时显示资料卡的效果
2014/07/02 Javascript
基于javascript的JSON格式页面展示美化方法
2014/07/02 Javascript
Jquery节点遍历next与nextAll方法使用示例
2014/07/22 Javascript
javascript 数组操作详解
2015/01/29 Javascript
jquery实现的缩略图预览滑块实例
2015/06/25 Javascript
JavaScript判断变量是否为数组的方法(Array)
2016/02/24 Javascript
jQuery如何解决IE输入框不能输入的问题
2016/10/08 Javascript
微信小程序 MD5加密登录密码详解及实例代码
2017/01/12 Javascript
angularjs 页面自适应高度的方法
2018/01/17 Javascript
Vue源码探究之状态初始化
2018/11/14 Javascript
微信小程序如何再次获取用户授权的方法
2019/05/10 Javascript
如何解决日期函数new Date()浏览器兼容性问题
2019/09/11 Javascript
OpenCV-Python实现轮廓检测实例分析
2018/01/05 Python
python实现指定字符串补全空格、前面填充0的方法
2018/11/16 Python
Python安装Flask环境及简单应用示例
2019/05/03 Python
使用APScheduler3.0.1 实现定时任务的方法
2019/07/22 Python
简单了解python中的f.b.u.r函数
2019/11/02 Python
python不同系统中打开方法
2020/06/23 Python
HTML5的语法变化介绍
2013/08/13 HTML / CSS
伦敦眼门票在线预订:London Eye
2018/05/31 全球购物
印尼第一大家居、生活和家具电子商务:Ruparupa
2019/11/25 全球购物
教师自荐信范文
2013/12/09 职场文书
秋季运动会广播稿
2014/02/22 职场文书
项目合作协议书
2014/04/16 职场文书
2014年小学教学工作总结
2014/11/13 职场文书
党员干部廉洁自律承诺书
2015/04/28 职场文书
学校世界艾滋病日宣传活动总结
2015/05/05 职场文书
能让Python提速超40倍的神器Cython详解
2021/06/24 Python
Html5同时支持多端sdk的小技巧
2021/11/17 HTML / CSS
Mybatis 一级缓存和二级缓存原理区别
2022/09/23 Java/Android