• 用原生js实现ajax


     1 // 通过createXHR()函数创建一个XHR对象
     2 function createXHR() {
     3   if(window.XMLHttpRequest) { // IE7、Firefox、Opera、Chrome和Safari
     4     return new XMLHttpRequest();
     5   }else if(window.ActiveXObject) { // IE6以下
     6     var versions = ['MSXML2.XMLHttp','Microsoft.XMLHTTP'];
     7     for (var i=0,len = versions.length; i<len; i++){
     8       try{
     9         return new ActiveXObject(versions[i]);
    10         break
    11       } catch (e) {
    12         console.log(e)
    13       }
    14     }
    15   } else {
    16     throw new Error('此浏览器不支持XHR对象')
    17   }
    18 }
    19 
    20 //封装ajax,参数为一个对象
    21 function ajax(obj) {
    22   var xhr = createXHR(); //创建XHR对象
    23   // 通过使用随机字符串解决IE浏览器第二次默认获取缓存的问题
    24   obj.url = obj.url + '?rand=' + Math.random();
    25   obj.data = params(obj.data); //通过params()将名值对转换成字符串
    26   //在使用XHR对象时,必须先调用open()方法
    27   //它接收三个参数,:请求类型(get、post)、请求的URL和表示是否异步
    28   xhr.open(obj.method,obj.url,obj.async) //打开和服务的链接
    29   //若是get请求,则将数据加到url后面
    30   if(obj.method === 'get'){
    31     obj.url += obj.url.indexOf('?') === -1? '?'+ obj.data : '&' + obj.data;
    32   }
    33   //如果是post请求
    34   if (obj.method === 'post'){
    35     //post需要自己设置http的请求头,来模仿表单提交
    36     xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    37     xhr.send(obj.data) //post方式将数据放在send()方法里 //send动作才是真正的给服务器按照上面open的url发送请求
    38   } else {
    39     xhr.send(null); //get方式则填null
    40   }
    41 
    42   xhr.onreadystatechange = function () {
    43     if (xhr.readyState == 4){ //判断对象的状态是否完成
    44         callback() //回调函数
    45     }
    46   }
    47 
    48   function callback() {
    49     if (xhr.status == 200 || xhr.status == 304) { //判断http的交互是否成功,200表示成功
    50       obj.success(xhr.responseText); //回调传递参数
    51     } else {
    52       alert('获取数据错误!错误代号:' + xhr.status + ',错误信息:' + xhr.statusText)
    53     }
    54   }
    55 }
    56 
    57 //名值对转换为字符串
    58 function params(data) {
    59   var arr = [];
    60   for (var i in data) {
    61     //特殊字符传参产生的问题可以使用encodeURIComponent()进行编码处理
    62     arr.push(encodeURIComponent(i)+ '=' + encodeURIComponent(data[i]))
    63   }
    64   return arr.join('&')
    65 }

     

  • 相关阅读:
    python3安装crypto出错,及解决方法
    php中的引用
    算法
    HTTP协议
    jdk 1.8 InvocationHandler 中文注释
    Java实现多线程的几种方法
    shell编写显示ps相关脚本
    逆波兰表达式求值(后序表达式)
    155. 最小栈(leetcode简单题)
    字符串逆序
  • 原文地址:https://www.cnblogs.com/zhaobao1830/p/7161185.html
Copyright © 2020-2023  润新知