实例讲解使用原生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 相关文章推荐
发布一个基于javascript的动画类 Fx.js
Nov 05 Javascript
基于jquery实现的定时显示与隐藏div广告的实现代码
Aug 22 Javascript
JavaScript显示表单内元素数量的方法
Apr 02 Javascript
JavaScript数据库TaffyDB用法实例分析
Jul 27 Javascript
基于jquery编写的放大镜插件
Mar 23 Javascript
JavaScript实战之菜单特效
Aug 16 Javascript
jQuery实现的简单在线计算器功能
May 11 jQuery
javascript算法之二叉搜索树的示例代码
Sep 12 Javascript
Vue+Element UI+Lumen实现通用表格分页功能
Feb 02 Javascript
Vue2.X和Vue3.0数据响应原理变化的区别
Nov 07 Javascript
jQuery实现简易QQ聊天框
Feb 10 jQuery
解决vue数据不实时更新的问题(数据更改了,但数据不实时更新)
Oct 27 Javascript
深入剖析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无限分类(树形类)的深入分析
2013/06/02 PHP
PHP+jquery+ajax实现即时聊天功能实例
2014/12/23 PHP
在CentOS上搭建LAMP+vsftpd环境的简单指南
2015/08/01 PHP
php中final关键字用法分析
2016/12/07 PHP
用js实现控制内容的向上向下滚动效果
2007/06/26 Javascript
JavaScript 放大镜 移动镜片效果代码
2011/05/09 Javascript
jQuery UI AutoComplete 使用说明
2011/06/20 Javascript
javascript打开word文档的方法
2014/04/16 Javascript
JS对象与json字符串格式转换实例
2014/10/28 Javascript
JavaScript面向对象的实现方法小结
2015/04/14 Javascript
纯jquery实现模仿淘宝购物车结算
2015/08/20 Javascript
jQuery实现字符串全部替换的方法【推荐】
2017/03/09 Javascript
利用Three.js如何实现阴影效果实例代码
2017/09/26 Javascript
Vue项目中最新用到的一些实用小技巧
2018/11/06 Javascript
JavaScript如何实现元素全排列实例代码
2019/05/14 Javascript
JS实现音乐导航特效
2020/01/06 Javascript
Vue scoped及deep使用方法解析
2020/08/01 Javascript
基于JavaScript实现大文件上传后端代码实例
2020/08/18 Javascript
Python 错误和异常小结
2013/10/09 Python
Python实现自动登录百度空间的方法
2017/06/10 Python
python游戏开发之视频转彩色字符动画
2019/04/26 Python
python标记语句块使用方法总结
2019/08/05 Python
wxPython+Matplotlib绘制折线图表
2019/11/19 Python
利用Python代码实现一键抠背景功能
2019/12/29 Python
python时间日期操作方法实例小结
2020/02/06 Python
通过实例解析python创建进程常用方法
2020/06/19 Python
Python错误的处理方法
2020/06/23 Python
python中取绝对值简单方法总结
2020/07/24 Python
Python结合百度语音识别实现实时翻译软件的实现
2021/01/18 Python
css3圆角边框和边框阴影示例
2014/05/05 HTML / CSS
Chain Reaction Cycles芬兰:世界上最大的在线自行车商店
2017/12/06 全球购物
Oracle性能调优原则
2012/05/03 面试题
大学军训感言1000字
2014/02/25 职场文书
勾股定理课后反思
2014/04/26 职场文书
2014党的群众路线教育实践活动总结材料
2014/10/31 职场文书
离退休人员聘用协议书
2014/11/24 职场文书