实例讲解使用原生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 变量作用域分析
Jul 04 Javascript
Javascript 实现的数独解题算法网页实例
Oct 15 Javascript
JS中数组Array的用法示例介绍
Feb 20 Javascript
JavaScript通过元素的ID和name设置样式
Jul 08 Javascript
使用AngularJS 应用访问 Android 手机的图片库
Mar 24 Javascript
jQuery extend()详解及简单实例
May 06 jQuery
详解从angular-cli:1.0.0-beta.28.3升级到@angular/cli:1.0.0
May 22 Javascript
jQuery表单选择器用法详解
Aug 22 jQuery
vue实现虚拟列表功能的代码
Jul 28 Javascript
一文彻底理解js原生语法prototype,__proto__和constructor
Oct 24 Javascript
vue 自定义组件添加原生事件
Apr 21 Vue.js
JavaScript实现一键复制内容剪贴板
Jul 23 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
跟我学Laravel之路由
2014/10/15 PHP
php实现把url转换迅雷thunder资源下载地址的方法
2014/11/07 PHP
php自动获取关键字的方法
2015/01/06 PHP
项目中应用Redis+Php的场景
2016/05/22 PHP
PHP基于自定义类随机生成姓名的方法示例
2017/08/05 PHP
js function定义函数使用心得
2010/04/15 Javascript
基于jQuery的图片剪切插件
2011/08/03 Javascript
通过Javascript读取本地Excel文件内容的代码示例
2014/04/08 Javascript
浅析Javascript匿名函数与自执行函数
2016/02/06 Javascript
JQuery EasyUI的使用
2016/02/24 Javascript
vue实现可增删查改的成绩单
2016/10/27 Javascript
bootstrap实现动态进度条效果
2017/03/08 Javascript
js截取字符串功能的实现方法
2017/09/27 Javascript
浅谈微信小程序flex布局基础
2018/09/10 Javascript
vue生命周期和react生命周期对比【推荐】
2018/09/19 Javascript
Webpack中loader打包各种文件的方法实例
2019/09/03 Javascript
浅谈Vue.use到底是什么鬼
2020/01/21 Javascript
解决Vue的项目使用Element ui 走马灯无法实现的问题
2020/08/03 Javascript
DWR内存兼容及无法调用问题解决方案
2020/10/16 Javascript
[03:54]Ehome出征西雅图 回顾2016国际邀请赛晋级之路
2016/08/02 DOTA
python实现zencart产品数据导入到magento(python导入数据)
2014/04/03 Python
将Python的Django框架与认证系统整合的方法
2015/07/24 Python
详解Python 序列化Serialize 和 反序列化Deserialize
2017/08/20 Python
在python3环境下的Django中使用MySQL数据库的实例
2017/08/29 Python
解决python3 安装完Pycurl在import pycurl时报错的问题
2018/10/15 Python
python 执行文件时额外参数获取的实例
2018/12/18 Python
python将字符串转换成json的方法小结
2019/07/09 Python
Python closure闭包解释及其注意点详解
2019/08/28 Python
如何整合JQuery和Prototype
2014/01/31 面试题
小学清明节活动方案
2014/03/08 职场文书
农民工工资发放承诺书
2014/03/31 职场文书
2014年体育教学工作总结
2014/12/09 职场文书
2014年底工作总结
2014/12/15 职场文书
2015年公司中秋节致辞
2015/07/31 职场文书
vue的项目如何打包上线
2022/04/13 Vue.js
浅谈css清除浮动(clearfix和clear)的用法
2023/05/21 HTML / CSS