一、Ajax的概念

  • Ajax是一种技术方案,但并不是一种新技术。它依赖的是现有的CSS/HTML/Javascript,而其中最核心的依赖是浏览器提供的XMLHttpRequest对象,是这个对象使得浏览器可以发出HTTP请求与接收HTTP响应。
  • Ajax:Asynchronous JavaScript and XML(异步js和XML)

    • 异步js:js的代码都是至到而下执行的,如果一块代码没有执行完毕,那后面的代码就不会执行。异步就是ajax可以做到不按顺序执行;
    • ajax不光能够处理XML格式的数据,还可以处理json、数组、字符串类型的数据;
    • XML:存储数据的一种格式:
//XML的格式类型;
<name>大力丸</name>
<age>18</age>
<qq>714206204</qq>
<email>daliwan@126.com</email>
  • ajax到底能干嘛:

js与后端进行数据交互的一种技术,通过请求协商好的接口,来获取到想要的数据

  • 优点

传输数据时候会在本页面请求服务器,不用跳转页面,从而减轻服务器压力。做到实时验证,减少用户返工率并且优化用户体验

二、Ajax数据交互流程

  • 创建一个ajax对象;
var val=inputs[0].value;
//下面这个是ajax对象;
var ajax=new XMLHttpRequest;
  • 填写请求地址;
//open是ajax对象上的一个方法;

ajax.open("get","PHP/get.PHP?user="+val,true);

//第一个参数决定是get还是post方式;
//第二个参数是请求地址,并且把要提交的加上去;
//第三个参数true代表异步,false代表同步;
  • 发送请求;
ajax.send();
  • 等待服务器响应;
ajax.onload=function(){
    //响应好了就接受数据;
    span.innerHTML=ajax.responseText;
}
  • 接收数据;

三、返回的数据类型

ajax.responseText这是服务器返回的值:
1.肯定是字符串,有的看起来是对象,其实是json的形式;

2.用JSON的方法:JSON.parse(aja.responseText)转成真正的对象就可以用对象操作的方法去操作了;

四、XHR的兼容问题

  • XMLHttpRequest是标准浏览器下的升级版本,IE6这些浏览器不支持;
  • IE6下用ActiveXObject(Microsoft.XMLHTTP)
//写一个兼容性的函数,实现跨浏览器;
var ajax=null;

if(window.XMLHttpRequest){
    ajax=new XMLHttpRequest;
}else{
    ajax=new ActiveXObject(Microsoft.XMLHTTP)
};

五、get和post的区别

  • get方式

    • 通过地址栏信息进行数据传输,传输的大小有限制;
    • 不安全,用户的所有信息都会暴露出来;
    • 拼接数据的时候要用encodeURI转一下码,不然有中文就会乱码;

      > `encodeURI`把文字转成符号;

      decodeURI把符号转成文字;

    • 不用设置请求头;
    • 数据拼接在open方法里;
    • 会有缓存问题;
  • post方式

    • 通过send向服务器传输数据,理论上来说是没有长度或体积限制;
    • 相对来说安全,因为不直接暴露用户信息;
    • 不用转码,已经通过请求头设置了数据格式,不会有乱码;
    • 数据要拼接在send方法里;
    • 没有缓存问题
    • 在send()的前面需要设置一个请求头(不设置要出错);
ajax.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
//创建对象;
var ajax=null;
if(window.XMLHttpRequest){
    ajax=new XMLHttpRequest;
}else{
    ajax=new ActiveXObject(Microsoft.XMLHTTP)
};
//填写请求地址;
ajax.open("post","PHP/post.PHP",true);
//发送请求,要在send前设置一下请求头;
ajax.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
ajax.send("user="+val)
//下面的步骤和get方法是一样的;

六、同步与异步

  • 同步

1、当send()方法调用后会等待服务器返回信息,如果服务器一直没有响应,就会阻塞后面的代码,后面的代码就不会执行
2、后面的代码执行受前面代码的影响,前面的代码没跑通,后面的代码就不会执行

  • 异步

1、当send()方法调用后,就会执行后面的代码,不用等待服务器的响应
2、后面的代码执行不受前面代码的影响

七、onreadystatechange与onload

  • ajax.readStateajax的运行步骤(第一步捕捉不到)

    • 它的值为4的话说明AJAX已经运行完毕;
    • 0 代表初始化,还没调用open方法;
    • 1 代表载入,已经调用send方法,正在发送请求;
    • 2 代表载入完成,send方法已完成,已收到全部响应内容;
    • 3 代表正在解析响应内容;
    • 4 代表响应完成,可以在客户端调用了;
  • ajax.status(状态码)

    • 200是成功的;
    • 404是错误的;
  • onreadStateChange

readstate的值发生变化就会触发这个事件;

  • onload

所有请求成功完成后触发,此时的readstata的值为4
IE(6,7,8)不支持

现在这个方法逐渐取代onreadstatechange这个方法了

ajax.onreadstatechange=function(){
    if(ajax.readstate==4){          //服务区响应完成了;
        if(ajax.status==200){       //服务器正常;
            //这里放要执行的代码;
        }
    }
}

八、封装ajax函数

封装ajax函数,传进函数里面的参数其实是一个对象

  • 对象中包包含以下几种数据,包含在一个对象里面:

    • URL:发送请求的地址,需要把请求发给谁;
    • method:发送请求的方法:get或者post;
    • dataType:响应之后返回的数据类型:JSON,XML,STRING;
    • data:请求的时候传的数据(它是一个对象需要处理格式);
    • succ:成功之后的callback;
    • fail:失败后的callback;
function ajax(json){
    //默认参数;
    var settings={
        url:"",method:"get",data:{},dataType:"json",succ:null,fail:null
    }
    
    //用户传的参数覆盖默认参数;
    for (var attr in json){
        settings[attr]=json[attr];
    }
    
    //把data拼成正确的格式;
    var arr=[];
    for (var attr in settings.data){
        arr.push(attr+"="+settings.data[attr]);
    }
    settings.data=arr.join("&");
    
    //声明变量;
    var ajax=window.XMLHttpRequest?new XMLHttpRequest():ActiveXObject("Microsoft.XMLHTTP");
    
    //设置请求方式;
    //请求地址里面的new Date()方法,是为了设置不同的时间戳去解决缓存的问题;
    if(settings.method.toLocalLowCase==="get"){
        ajax.open("get",settings.url+"?"+settings.data+"&"+new Date().getTime(),true);
        ajax.send();
    }else{
        ajax.open("post",settings.url,true);
        //注意要设置一个请求头;
        ajax.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
        ajax.send(settings.data);
    }
    
    //设置完成时间的兼容性;IE6下是没有ajax.onload方法的;
    if(typeof ajax.onload==="undefined"){
        ajax.onreadystatechange=ready;
    }else{
        ajax.onload=ready;
    }
    
    //封装一个ready()函数;
    function ready(){
        if(ajax.readystate==4){
            if(ajax.status==200){
                //用一个switch判断返回值得类型;
                switch(settings.dataType.toLocalLowCase()){
                    case "string"   : 
                        settings.succ(ajax.responseText);
                        break;
                    case "json"     :
                        //把responsetext转成json格式;
                        setting.succ(JSON.parse(ajax.responseText));
                        break;
                    case "xml"      :
                        settings.succ(ajax.responseXml);
                        break;
                }
            }else{
                settings.fail(ajax.status);
            }
        }
    }
}

要注意第57行的JSON.parse在低版本的浏览器中是不兼容的,需要下载一个json2.js的文件解决这个问题;

九、ajax上传

  • 上传只能用 post 的方法,后台要处理中文相关的问题;
  • ajax.upload.onprogress 上传的进度事件;就是上传的时候要做的事情;

    • ev.loaded 已经上传的文件大小;
    • ev.total 总的文件大小;

    通过这个可以做出来一个上传的进度条;
    用H5中的<progress></progress>这个API;

  • files 上传的选中的文件列表;

    1.包括文件大小、类型、最后修改的时间等等;

  • FormData 用来创建与表单格式相同的数据,它是XHR的二级定义,是一个二进制的数据;低版本的浏览器不支持

**我自己对于FormData的理解:
FormDate可以new出来一个实例,这个实例可以继承它身上的append方法;这个操作放在ajax.openajax.send之间**

var formdata=new FormData();

    //下面通过循环把选中的文件里面的额东西添加到这个对象身上;

for(var i=0;i<inputs[0].files.length;i++){

    //inputs[0]指的是一个type="file"的表单控件;

    formdata.append("file",inputs[0].files[i]);
}

    //这时候formdata就可以被发送给服务器了,前面加上一个请求头;

十、跨域的问题

  • 概念:

两个不同域名下的数据进行交互。Ajax之所以不能跨域其实是因为XMLHttpRequest受到同源策略的限制,只能让它访问同源下的数据,不能访问不同源下的数据;

  • 同源策略:

每个网站只能读取同一来源的数据,这里的同一来源指的是主机名(域名)、协议(http/https)和端口号的组合。在没明确授权的情况下,不能读写对方的资源,它是浏览器最核心也最基本的安全功能;
只要有一个不一样就跨域;

  • 解决跨域的方法:

    • 在标准浏览器下XMLHttpRequest配合后端设置一个请求权限,在PHP里写上 header('Access-Control-Allow-Origin:*');
    • 服务器代理,缺点是后端开发的成本大;
    • iframe、flash、postMessage、WebSocket;

这些方法都不是最优的,下面提供一种方法叫做 jsonp

十一、jsonp

  • jsonp的概念(json+padding)

    • 通过script标签引入某些数据,是同步模式的,用script标签做跨域的时候,不建议将数据提前加载,需要按需加载
    • 当需要数据的时候创建一个script标签,将需要的数据放在src中,通过onload去监听是否请求过来,请求完毕就调用传回来的数据(异步加载);
    • jsonp不能用post请求,只能是get请求;

带src属性的<script><img><iframe><link>等标签是不需要遵守同源策略的,但是通过src加载的资源,浏览器限制了javascript的权限,能读不能写;这就是jsonp能实现跨域的原因;

  • jsonp中的回调函数

    • 通过jsonp的方式的数据一般都会放在一个回调函数里;
    • 请求到的结果是这样的getData({"color":["red","green","blue"]})

      • 数据放在函数的参数里,可以是任何数据形式(对象、数组)
      • 回调函数的名字要么是后端定死的,要么是我们在请求地址跟动态加上的

注意callback是要设置成全局的,要不就放在操作的前面;

  • 封装一个jsonp
function jsonp(obj){
    var settings={
        url:'',//地址
        data:{},//要发送的数据
        callBack:'callback',//url里存储回调函数名字的变量
        fnName:'jsonp_'+new Date().getTime(),//回调函数的名字
        succ:function(){}        //请求成功的回调函数
    };
    
    for(var attr in obj){
        settings[attr]=obj[attr];
    }
    
    //创建一个script标签
    var script=document.createElement("script");
    script.className='sc';
    settings.data[settings.callBack]=settings.fnName;
    
    var head=document.getElementsByTagName('head')[0];
    
    
    //把要传的数据拼起来
    var arr=[];            //['wd=sds','cb=jQuery1']
    for(var attr in settings.data){
        arr.push(attr+'='+settings.data[attr]);
    }
    settings.data=arr.join('&');
    script.src=settings.url+'?'+settings.data;
    
    head.appendChild(script);
    
    //把回调函数挂载到window身上
    window[settings.fnName]=function(data){
        //当调用这个函数的时候,先把页面中所有的已经请求过的script删掉
        var scripts=head.getElementsByTagName('script');
        for(var i=0;i<scripts.length;i++){
            if(scripts[i].className=='sc'){
                head.removeChild(scripts[i]);
            }
        }
        
        settings.succ(data);
    };
}

ajax与jsonp一点基础整理的更多相关文章

  1. 解析html5 canvas实现背景鼠标连线动态效果代码

    流行的动态背景连线特效。今天小编通过实例代码给大家解析html5 canvas实现背景鼠标连线动态效果,感兴趣的朋友一起看看吧

  2. 应用程序关闭时的iOS任务

    我正在构建一个应用程序,通过ajax将文件上传到服务器.问题是用户很可能有时不会有互联网连接,并且客户希望在用户重新连接时安排ajax调用.这可能是用户在离线时安排文件上传并关闭应用程序.应用程序关闭时可以进行ajax调用吗?

  3. 在android中引用javax.script.ScriptEngine或者评估一个javascript表达式

    如果没有,那么有可能在android中评估一个javascript表达式?

  4. android – Phonegap本地构建 – jquery ajax错误:readystate 0 responsetext status 0 statustext error

    解决方法您是否在索引文件中包含了内容安全元标记?

  5. Ajax简单的异步交互及Ajax原生编写

    一提到异步交互大家就会说ajax,仿佛ajax这个技术已经成为了异步交互的代名词.那下面将研究ajax的核心对象

  6. 简单易懂的JSONP和CORS跨域方案详解

    这篇文章主要为大家介绍了简单易懂的JSONP和CORS跨域方案详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  7. Ajax跨域问题的解决办法汇总(推荐)

    本文给大家分享多种方法解决Ajax跨域问题,非常不错具有参考借鉴价值,感兴趣的朋友一起学习吧

  8. ajax编写简单的登录页面

    这篇文章主要为大家详细介绍了ajax编写简单登录页面的具体代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. ajax从JSP传递对象数组到后台的方法

    今天小编就为大家分享一篇ajax从JSP传递对象数组到后台的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  10. 解决ajax返回验证的时候总是弹出error错误的方法

    这篇文章主要介绍了解决ajax返回验证的时候总是弹出error错误的方法,感兴趣的小伙伴们可以参考一下

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部