JavaScript Ajax编程 应用篇


Posted in Javascript onJuly 02, 2016

一、Ajax  (Asynchronous JavaScript + XML)  能够像服务器请求额外的数据而无需卸载页面,即局部刷新技术
二、创建一个XHR对象

function createXHR () {
 if (typeof XMLHttpRequest != "undefined") {
  return new XMLHttpRequest();
 } else if (typeof ActiveXObject != "undefined") { // < Ie7 
  if (typeof arguments.callee.activeXString != "string") {
  var version = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp"],
   i, len;
  for ( i = 0, len = version.length; i < len; i++) {
   try { 
   new ActiveXObject(version[i]);
   arguments.callee.activeXString = version[i];
   break;
   } catch (ex) {}
  }
  }
  return new ActiveXObject(arguments.callee.activeXString);
 } else {
  throw new Error("No Support For XHR");
 }
 }
 var xhr = createXHR();
 alert(xhr); // [object XMLHttpRequest]

三、用法    注意:本节的实例都应用于服务器端
    1.调用open()方法。它接受3 个参数:要发送的请求的类型("get"、"post"等)、请求的URL 和表示是否异步发送请求的布尔值。
    2.要发送请求,调用send()方法,接受一个参数,即要作为请求发送的主体。如果不需要,则为null
    3.返回的数据会自动填充到XHR对象的属性中。   

var xhr = createXHR();
 // GET方式同步打开example.txt文件
 // 同步:javascript代码会等待服务器响应后执行
 xhr.open("get", "example.txt", false);
 xhr.send(null);
 // status代表响应的http状态
 // 200代表ok,304表示缓存
 if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
  alert(xhr.responseText); // 返回响应的文本,123456
 } else {
  alert("Request was unsuccessful: " + xhr.status);
 }

    4.example.text文件内容为字符串: 123456

四、前面的使用的同步的方式,当然不会存在问题,所有我们要挑战一个异步的方法。   

var xhr = createXHR();
 // xhr.readyState表示请求/响应的当前状态,4代表已经接受了全部的响应数据
 // 另外只要xhr.readyState的值发生了改变,那么xhr.onreadystatechange事件就会触发
 xhr.onreadystatechange = function(){
 if (xhr.readyState == 4){
  if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
  alert(xhr.responseText);
  } else {
  alert("Request was unsuccessful: " + xhr.status);
  }
 }
 };
 xhr.open("get", "example.txt", true);
 xhr.send(null);

五、每个HTTP 请求和响应都会带有相应的头部信息
    1.默认情况下,在发送XHR 请求的同时,还会发送下列头部信息。
        ①Accept:浏览器能够处理的内容类型。
        ②Accept-Charset:浏览器能够显示的字符集。
        ③Accept-Encoding:浏览器能够处理的压缩编码。
        ④Accept-Language:浏览器当前设置的语言。
        ⑤Connection:浏览器与服务器之间连接的类型。
        ⑥Cookie:当前页面设置的任何Cookie。
        ⑦Host:发出请求的页面所在的域。
        ⑧Referer:发出请求的页面的URI。
        ⑨User-Agent:浏览器的用户代理字符串。
    2.使用setRequestHeader()方法可以设置自定义的请求头部信息。接受两个参数:头部字段的名称和头部字段的值      

var xhr = createXHR();
 // xhr.readyState表示请求/响应的当前状态,4代表已经接受了全部的响应数据
 // 另外只要xhr.readyState的值发生了改变,那么xhr.onreadystatechange事件就会触发
 xhr.onreadystatechange = function(){
  if (xhr.readyState == 4){
  if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
   alert(xhr.responseText);
  } else {
   alert("Request was unsuccessful: " + xhr.status);
  }
  }
 };
 xhr.open("get", "example.txt", true);
 // 必须在open()之后调用
 xhr.setRequestHeader("name", "zhang"); // 在example.txt的http中可以看到接受的 "name" : "zhang"
 xhr.send(null);

    3.获取请求的头部信息和相应信息,调用getResponseHeader()方法getAllResponseHeaders()方法     

var xhr = createXHR();
 // xhr.readyState表示请求/响应的当前状态,4代表已经接受了全部的响应数据
 // 另外只要xhr.readyState的值发生了改变,那么xhr.onreadystatechange事件就会触发
 xhr.onreadystatechange = function(){
  if (xhr.readyState == 4){
  if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
   // 获取响应头的Content-Type
   var connection = xhr.getResponseHeader("Content-Type");
   // alert(connection); // text/plain
   // 获取所有的响应信息
   var all = xhr.getAllResponseHeaders();
   alert(all);
  } else {
   alert("Request was unsuccessful: " + xhr.status);
  }
  }
 };
 xhr.open("get", "example.txt", true);
 xhr.send(null);

六、GET请求,前面我们已经讨论了GET请求的方法,现在我们来扩展一下,为GET请求添加一些参数

/**
 url : 不带请求的url
 name : 请求键
 value : 请求值
 return : 带请求字符串的url
 */
 function addURLParam(url, name, value) {
 url += (url.indexOf("?") == -1 ? "?" : "&");
 url += encodeURIComponent(name) + "=" + encodeURIComponent(value);
 return url;
 }
 var xhr = createXHR();
 xhr.onreadystatechange = function(){
 if (xhr.readyState == 4){
  if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
  alert(xhr.responseText);
  } else {
  alert("Request was unsuccessful: " + xhr.status);
  }
 }
 };
 var url = "example.txt";
 url = addURLParam(url, "name", "zhang");
 url = addURLParam(url, "age", "23");
 // 请求的url变成了:example.txt?name=zhang&age=23
 xhr.open("get", url, true);
 xhr.send(null);

七、POST请求
    1.案例分析:接下来我们共同讨论一个以post方法发送请求的ajax应用,即用户注册,根据你注册用户名返回提示。
    2.实现步骤
        1) 首先要有一个注册的页面(当然,这里很简陋)ajax.html         

<!DOCTYPE HTML>
  <html>
  <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <title>无标题文档</title>
  <style>
  </style>
  </head>
  <body>
  <form name="myForm" method="post">
  姓名:<input type="text" name="username" /><label id="userLabel">请输入用户名</label><br/>
  密码:<input type="password" name="password" /><br/>
   <input type="submit" value="登录" /><br/> 
  </form>
  <script src="EventUtil.js"></script>
  <script src="serialize.js"></script>
  <script src="ajax.js"></script>
  <script src="ajaxDo.js"></script>
  </body>
  </html>

        2) 接着当然是javascript部分
            ①EventUtil.js,这里只是将事件监听的部分列出来              

var EventUtil = {
   addEvent : function (element, type, handler) {
   if (element.addEventListener)
   {
    element.addEventListener(type, handler, false);
   } else if (element.attachEvent)
   {
    element.attachEvent("on" + type, handler);
   }
   }
  }

            ②serialize.js:表单序列化            

function serialize(form){
   var parts = [], field = null, i, len, j, optLen, option, optValue;
   for (i=0, len=form.elements.length; i < len; i++){
   field = form.elements[i];
   switch(field.type){
    case "select-one":
    case "select-multiple":
    if (field.name.length){
    for (j=0, optLen = field.options.length; j < optLen; j++){
     option = field.options[j];
     if (option.selected){
     optValue = "";
     if (option.hasAttribute){
      optValue = (option.hasAttribute("value") ?
      option.value : option.text);
     } else {
      optValue = (option.attributes["value"].specified ?
      option.value : option.text);
     }
     parts.push(encodeURIComponent(field.name) + "=" +
     encodeURIComponent(optValue));
     }
    }
    }
    break;
    case undefined: //字段集
    case "file": //文件输入
    case "submit": //提交按钮
    case "reset": //重置按钮
    case "button": //自定义按钮
    break;
    case "radio": //单选按钮
    case "checkbox": //复选框
    if (!field.checked){
    break;
    }
    /* 执行默认操作*/
    default:
    //不包含没有名字的表单字段
    if (field.name.length){
     parts.push(encodeURIComponent(field.name) + "=" +
     encodeURIComponent(field.value));
    }
   }
   }
   return parts.join("&");
  }

            ③ajax.js,就是上面的那个createXHR()函数,这里就不罗列了。
            ④ajaxDo.js,核心文件,就是我们操作部分,这个名字乱写的。
              

var form = document.forms[0]; // 获取表单
  var username = form.elements['username']; // 用户名
  var userLabel = document.querySelector("#userLabel"); // 提示标签
  EventUtil.addEvent(username, "blur", function() {
   var xhr = createXHR();
   xhr.onreadystatechange = function(){
   if (xhr.readyState == 4){
    if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){ 
    var text = xhr.responseText;
    // 当为true时,提示绿色字体
    // 当为false时,提示为红色字体
    if(text) {
     userLabel.style.color = "green";
     userLabel.firstChild.data = "恭喜你,用户名可用";
    } else {
     userLabel.style.color = "red";
     userLabel.firstChild.data = "对不起,该用户已存在";
    }
    } else {
    alert("Request was unsuccessful: " + xhr.status);
    }
   }
   };
   // POST请求
   xhr.open("post", "dome.php", true);
   // 提交的内容类型
   xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
   // 将表单序列化
   xhr.send(serialize(form));
  });

    3.改进部分:大家都看见了,刚才在提交表单时,我们序列化了表单。在XMLHttpRequest 2 级为此定义了FormData 类型,它会自动为我们序列化表单,不需要我们自己写了。
        我们只动部分代码       

// ...此处省略代码和上面一致
 // POST请求
 xhr.open("post", "dome.php", true);
 // 仅仅这里需要改动,代替之前serialize.js中的函数
 xhr.send(new FormData(form));

八、其他部分(了解,因为兼容性还不够)
    1.超时设定      

xhr.open("get", "example.txt", true);
 xhr.timeout = 1000; //将超时设置为1 秒钟(仅适用于IE8+)
 xhr.ontimeout = function(){
 alert("Request did not return in a second.");
 };
 xhr.send(null);

    2.overrideMimeType()方法,针对服务器返回的类型  

var xhr = createXHR();
 xhr.open("get", "example.txt", true);
 xhr.overrideMimeType("text/xml"); // 之前的是text/plain
 xhr.send(null);

    3.进度事件
        1.load事件,只要浏览器收到服务器的信息就触发     

var xhr = createXHR();
  xhr.onload = function(){
  if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
   alert(xhr.responseText);
  } else {
   alert("Request was unsuccessful: " + xhr.status);
  }
  };
  xhr.open("get", "example.txt", true);
  xhr.send(null);

        2.progress事件,浏览器接收新数据期间周期性地触发         

var xhr = createXHR();
  xhr.onprogress = function(event){
  var divStatus = document.getElementById("status");
  // 计算从响应中已经接收到的数据的百分比
  if (event.lengthComputable){
   divStatus.innerHTML = "Received " + event.position + " of " +
   event.totalSize +" bytes";
  }
  };
  xhr.open("get", "altevents.php", true);
  xhr.send(null);

以上就是本文的全部内容,希望对大家的学习有所帮助。

Javascript 相关文章推荐
JS的replace方法详细介绍
Nov 09 Javascript
Javascript图像处理—亮度对比度应用案例
Jan 03 Javascript
用jQuery获取IE9下拉框默认值问题探讨
Jul 22 Javascript
JavaScript中按位“异或”运算符使用介绍
Mar 14 Javascript
JavaScript创建一个object对象并操作对象属性的用法
Mar 23 Javascript
javascript实现通过表格绘制颜色填充矩形的方法
Apr 21 Javascript
javascript闭包(Closure)用法实例简析
Nov 30 Javascript
node网页分段渲染详解
Sep 05 Javascript
微信小程序 POST请求(网络请求)详解及实例代码
Nov 16 Javascript
js使用generator函数同步执行ajax任务
Sep 05 Javascript
使用selenium抓取淘宝的商品信息实例
Feb 06 Javascript
vue车牌号校验和银行校验实战
Jan 23 Javascript
js跨域资源共享 基础篇
Jul 02 #Javascript
JavaScript数据存储 Cookie篇
Jul 02 #Javascript
JavaScript实现简单的拖动效果
Jul 02 #Javascript
jQuery插件简单学习实例教程
Jul 01 #Javascript
jquery插件autocomplete用法示例
Jul 01 #Javascript
AngularJS 避繁就简的路由
Jul 01 #Javascript
AngularJS使用指令增强标准表单元素功能
Jul 01 #Javascript
You might like
php上传文件问题汇总
2015/01/30 PHP
制作个性化的WordPress登陆界面的实例教程
2016/05/21 PHP
PHP 99乘法表的几种实现代码
2020/10/13 PHP
javascript循环变量注册dom事件 之强大的闭包
2010/09/08 Javascript
Javascript中浮点数相乘的一个解决方法
2014/06/03 Javascript
浅谈js中变量初始化
2015/02/03 Javascript
简介JavaScript中POSITIVE_INFINITY值的使用
2015/06/05 Javascript
实例解析jQuery中proxy()函数的用法
2016/05/24 Javascript
JS简单实现仿百度控制台输出信息效果
2016/09/04 Javascript
微信小程序 rpx 尺寸单位详细介绍
2016/10/13 Javascript
JS字符串按逗号和回车分隔的方法
2017/04/25 Javascript
使用use注册Vue全局组件和全局指令的方法
2018/03/08 Javascript
vue移动UI框架滑动加载数据的方法
2018/03/12 Javascript
解决eclipse中没有js代码提示的问题
2018/10/10 Javascript
基于JS实现web端录音与播放功能
2019/04/17 Javascript
Javascript新手入门之字符串拼接与变量的应用
2020/12/03 Javascript
python中文件变化监控示例(watchdog)
2017/10/16 Python
Python将图片转换为字符画的方法
2020/06/16 Python
Python字符串的一些操作方法总结
2019/06/10 Python
Python中list循环遍历删除数据的正确方法
2019/09/02 Python
python 操作hive pyhs2方式
2019/12/21 Python
python重要函数eval多种用法解析
2020/01/14 Python
在django中使用apscheduler 执行计划任务的实现方法
2020/02/11 Python
安装不同版本的tensorflow与models方法实现
2021/02/20 Python
举例详解CSS3中的Transition
2015/07/15 HTML / CSS
详解如何在css中引入自定义字体(font-face)
2018/05/17 HTML / CSS
html5页面结构_动力节点Java学院整理
2017/07/10 HTML / CSS
京东奢侈品:全球奢侈品牌
2018/03/17 全球购物
比驿:全球酒店比价网
2018/06/20 全球购物
Python是如何进行类型转换的
2013/06/09 面试题
自主招生自荐信
2013/12/08 职场文书
研究生毕业鉴定
2014/01/29 职场文书
理财学专业自荐书
2014/06/28 职场文书
党员三严三实心得体会
2014/10/13 职场文书
大卫科波菲尔读书笔记
2015/06/30 职场文书
关于JavaScript回调函数的深入理解
2021/06/27 Javascript