实例讲解使用原生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 相关文章推荐
JS将表单导出成EXCEL的实例代码
Nov 11 Javascript
Json序列化和反序列化方法解析
Dec 19 Javascript
HTML页面登录时的JS验证方法
May 28 Javascript
JavaScript function 的 length 属性使用介绍
Sep 15 Javascript
javascript 原型链维护和继承详解
Nov 26 Javascript
JS实现两表格里数据来回转移的方法
May 28 Javascript
JavaScript判断对象是否为数组
Dec 22 Javascript
Angular设置title信息解决SEO方面存在问题
Aug 19 Javascript
JavaScript利用闭包实现模块化
Jan 13 Javascript
Angularjs根据json文件动态生成路由状态的实现方法
Apr 17 Javascript
vue.js过滤器+ajax实现事件监听及后台php数据交互实例
May 22 Javascript
在Layui中实现开关按钮的效果实例
Sep 29 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
WordPress中重置文章循环的rewind_posts()函数讲解
2016/01/11 PHP
php 的反射详解及示例代码
2016/08/25 PHP
PHP实现的猴王算法(猴子选大王)示例
2018/04/30 PHP
PHP yield关键字功能与用法分析
2019/01/03 PHP
一个判断email合法性的函数[非正则]
2008/12/09 Javascript
jQuery实现的类flash菜单效果代码
2010/05/17 Javascript
关于javascript中this关键字(翻译+自我理解)
2010/10/20 Javascript
Jquery右下角抖动、浮动 实例代码(兼容ie6、FF)
2013/08/15 Javascript
js实现百度联盟中一款不错的图片切换效果完整实例
2015/03/04 Javascript
JS折半插入排序算法实例
2015/12/02 Javascript
jQuery解析json格式数据简单实例
2016/01/22 Javascript
jQuery+css实现炫目的动态块漂移效果
2016/01/28 Javascript
ExtJS 4.2 Grid组件单元格合并的方法
2016/10/12 Javascript
jQuery解析返回的xml和json方法详解
2017/01/05 Javascript
详解Nodejs之npm&amp;package.json
2017/06/15 NodeJs
jQuery代码优化方法总结
2018/01/29 jQuery
vue-cli脚手架-bulid下的配置文件
2018/03/27 Javascript
React Form组件的实现封装杂谈
2018/05/07 Javascript
浅谈element中InfiniteScroll按需引入的一点注意事项
2020/06/05 Javascript
python查询sqlite数据表的方法
2015/05/08 Python
Python脚本实现虾米网签到功能
2016/04/12 Python
Python匹配中文的正则表达式
2016/05/11 Python
如何使用Python的Requests包实现模拟登陆
2018/04/27 Python
python模拟鼠标点击和键盘输入的操作
2019/08/04 Python
Django2 连接MySQL及model测试实例分析
2019/12/10 Python
python程序输出无内容的解决方式
2020/04/09 Python
python爬虫把url链接编码成gbk2312格式过程解析
2020/06/08 Python
为什么说python更适合树莓派编程
2020/07/20 Python
使用 CSS3 中@media 实现网页自适应的示例代码
2020/03/24 HTML / CSS
ghd法国官方网站:英国最受欢迎的美发工具品牌
2019/04/18 全球购物
个人求职简历的自我评价范文
2013/10/09 职场文书
校庆活动策划方案
2014/06/05 职场文书
英语教育专业毕业生求职信
2014/08/28 职场文书
2015年保险公司内勤工作总结
2015/05/23 职场文书
2016年党员公开承诺书格式范文
2016/03/24 职场文书
mysql5.7的安装及Navicate长久免费使用的实现过程
2021/11/17 MySQL