一、简介

1、ajax是Asynchronous Javascript and XML的缩写,意思是执行异步的网络请求

2、我们会发现使用form表单submit按钮提交表单的时候,网页会有执行刷新操作,在新页面告知操作结果,而ajax技术可以使得向服务器请求数据的时候无需卸载页面,得到更好的体验

3、ajax的核心是XMLHttpRequest对象,它实现了异步方式从服务器获取数据,也就是用XHR对象获取到服务器的数据,再使用DOM将数据更新到页面中

4、虽然ajax名字中包含了XML,但是他只是一种通信手段,与具体数据格式没有关系,因为当时主流使用XML作为前后台通信数据的格式,所以名字中使用了XML;而现在主要使用的都是JSON格式的字符串

二、XMLHttpRequest对象

ajax的实现流程如下:

  1. 创建XHR对象
  2. 调用open()方法,创建请求
  3. 调用send()方法,发送请求
  4. 捕获请求状态,判断请求结果
  5. 获取数据库返回的数据

1、创建XHR对象

XHR对象首次实现是在ie5上,当时使用的是对象,所以XHR下ie上有两个版本的实现方式,ie7以下的对象与ie7及以上的XHR对象,其余浏览器统一都是使用的XHR对象

所以创建对象的时候需要有兼容性写法


  
  
  
  

2、调用open()方法


  
  
open()方法接收3个参数
  • method:数据提交方式,字符串形式,可以使用"get"或"post"
  • url:请求对象地址,字符串表示(get方式与post方式有差异)
  • boolean:true(默认)表示异步请求,false表示同步请求(相信使用ajax都是为了异步的,所以这里就用true,或者不填写)
get方式请求

使用get方式提交数据时需要将提交内容以固定的格式附加在URL后面,格式如下:


  
  
post方式请求

使用post方式提交数据,提交内容是作为send()方法的参数提交的,所以URL后面无需附加参数


  
  

注意:因为已经不再使用form表单,所以后台无法再使用name属性获取数据,之前定义在form表单name属性中的内容现在就是在中的中,相应的,post方式就是下文中的postbody中的

3、调用send()方法


  
  
send()方法接收1个参数
  • postbody:字符串形式,填入需要提交的数据;如果没有提交的数据,可以填入
get方式请求

因为get方式下的数据已经附加在URL后面提交,所以这里一般填入

post方式请求

数据的格式如下:
postbody = "name1=value1 & name2=value2";


  
  

注意1:此处用post方式提交数据与用form表单提交毕竟有所不同,服务器会需要程序来读取并解析原始数据,所以我们需要使用XHR来模仿表单提交:


  
  

注意2:这个方法只能加在open()方法之后,send()方法之前


  
  

4、捕获请求状态,判断结果

send()方法调用后,请求就会被提交到服务器;多数情况下,我们会发送异步请求先检查请求过程当前的活动阶段,再判断请求是否返回成功

XHR对象相关属性:
  • readyState:请求 /相应过程的当前活动阶段
  • responseText:作为响应主体被返回的文本
  • responseXML:如果相应的内容类型是text/xml或者application这个属性中将保存着响应数据的XMLDOM文档
  • status:相应的HTTP状态
  • statusText:HTTP状态说明
我们利用原生的onreadystatechange事件来监听readyState变化
readyState返回值如下:
readyState返回值


只要readyState的值有一个值变为另一个值,就会触发一次事件,可以利用此事件来返回监听到的请求/响应过程状态值

我们关心的是readyState值为4的情况,因为这是代表所有数据已经准备就绪;同时如果status返回的是200,那么可以确定该次去请求/响应过程全部完成

status返回值如下:
status返回值


注意:这里不要使用statusText去判断,因为该值在跨浏览器时不可靠

最后的返回结果,不管是什么类型内容,都会被保存在responseText中

监听代码如下:
//监听readyState状态与status返回值
request.onreadystatechange = function () {
    if(request.readyState == 4 && request.status == 200){
        alert(request.responseText);
    }
}



  
  

综上所述的内容,就是整个ajax请求的全部流程,我们在js中最后拿到的就是后台返回的responseText,只里面保存的一般来说是JSON格式的字符串,我们可以将其转换成数组或者对象后提取其中的键值对

三、封装使用

以下代码是将上述的过程进行的封装,使得使用时只要调用函数并在回调函数中实现功能就可以了

  
  
使用方法举例:

下面定义了一个简单的表单提交用户名和密码,使用回调函数拿到后台返回的JSON串后,转换成对象再取出其中的信息,告知用户是登陆成功还是失败


 
 
作者:小pxu链接:http://www.jianshu.com/p/ff9e1139ea51來源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。ActiveXActiveXif(window.XMLHttpRequest){ var request = new XMLHttpRequest(); }else{ //这是ie7以下的写法 var request = new ActiveXObject("Microsoft.XMLHttp"); }request.open(method,url,boolean);url = "地址 ? name1=value1 & name2=value2";//获取到用户名及密码的输入框 var username = document.getElementById("username"); var passwd = document.getElementById("passwd"); //将输入内容附加在URL后面 var url = "PHP/get.PHP?username="+username.value+"&passwd="+passwd.value; //调用open()方法 request.open("get",true);//获取到用户名及密码的输入框 var username = document.getElementById("username"); var passwd = document.getElementById("passwd"); //将输入内容附加在URL后面 var url = "PHP/post.PHP"; //调用open()方法 request.open("post",true);name1=value1name1name1request.send(postbody);nullnull//获取到用户名及密码的输入框 var username = document.getElementById("username"); var passwd = document.getElementById("passwd"); //将输入内容附加在URL后面 var postbody = "username="+username.value+"&passwd="+passwd.value; //调用send()方法 request.send(postbody);//将Content的头部信息重新设置 //定义表单提交时的内容类型,并以适当类型创建一个字符串 request.setRequestHeader("Content-Type","application/x-www/form-unencoded");//实际使用方法 var username = document.getElementById("username"); var passwd = document.getElementById("passwd"); var url = "PHP/post.PHP"; request.open("post",true); //放置的位置一定在这里 request.setRequestHeader("Content-Type","application/x-www/form-unencoded"); var postbody = "username="+username.value+"&passwd="+passwd.value; request.send(postbody);onreadystatechange<script> /* * method是请求方式 * url是网络请求的地址 * postboidy是post方式请求时的提交数据 * successCallback是请求成功的函数 * errorCallback是请求失败的函数 */ function request (method,postbody,successCallback,errorCallback) { //创建一个请求对象 if(window.XMLHttpRequest){ var request = new XMLHttpRequest(); }else{ var request = new ActiveXObject("Microsoft.XMLHttp"); } if(arguments[0]=="POST"){ //创建请求 request.open(method,true); //设置上传类型 request.setRequestHeader("content-type","application/x-www-form-urlencoded"); }else if(arguments[0]=="GET"){ request.open(method,true); } //发送请求 request.send(postbody); //状态监听 request.onreadystatechange = function () { if(request.readyState ==4 && request.status == 200){ //请求成功的回调函数 if(successCallback){ successCallback(request.responseText); } } else if (request.readyState == 4 && request.status != 200) { //请求失败的回调函数 if(errorCallback){ errorCallback(request.statusText); } } } } </script>//html部分 //调用封装好的函数 <script src="request.js"></script> <div class="form"> <input type="text" id="username"> <input type="password" id="passwd"> <button id="loginBtn">登录</button> </div> //js部分 <script> var username = document.getElementById("username"); var passwd = document.getElementById("passwd"); var loginBtn = document.getElementById("loginBtn") loginBtn.onclick = function () { //设置请求地址及提交内容 var url = "login.PHP"; var postbody = "username="+username.value+"&passwd="+passwd.value; //发起ajax请求,并使用回调函数实现功能 request("POST",function (resText) { //把json格式的字符串转换成对象 var obj = JSON.parse(resText); alert(obj.msg); }); } </script> //PHP部分login.PHP <?PHP //从请求中获取用户名和密码 $username = $_POST["username"]; $passwd = $_POST["passwd"]; //连接服务器 @$MysqLi = new MysqLi("localhost","root","","user"); $MysqLi->query("set names utf8"); //查询语句 $sql = "SELECT * FROM user WHERE username='$username' AND passwd='$passwd'"; //数据库执行查询 $result = $MysqLi->query($sql); //判断查询结果是否有值,并定义返回字符串 //echo出来的就是返回前端的数据 if($result->num_rows > 0){ echo '{"errorcode":0,"msg":"登陆成功"}'; }else{ echo '{"errorcode":1,"msg":"用户名或密码错误"}'; } //关闭服务器 $MysqLi->close(); ?>

Ajax使用学习的更多相关文章

  1. 详解使用postMessage解决iframe跨域通信问题

    这篇文章主要介绍了详解使用postMessage解决iframe跨域通信问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  2. ios – 将视频分享到Facebook

    我正在编写一个简单的测试应用程序,用于将视频从iOS上传到Facebook.由于FacebookSDK的所有文档都在Objective-C中,因此我发现很难在线找到有关如何使用Swift执行此操作的示例/教程.到目前为止我有这个在我的UI上放置一个共享按钮,但它看起来已禁用,从我读到的这是因为没有内容设置,但我看不出这是怎么可能的.我的getVideoURL()函数返回一个NSURL,它肯定包含视

  3. ios – 错误域= NSURLErrorDomain代码= -1003“找不到具有指定主机名的服务器

    当我尝试在设备上运行应用程序时出现此错误.当我在模拟器上运行它并且post请求正常工作时,我没有收到此错误.这是我的代码片段:任何帮助表示赞赏.谢谢解决方法此错误通常会提示DNS相关问题.检查设备上的DNS设置并确认您可以使用Safari或其他浏览器浏览互联网.如果有一个url,你可以在同一台服务器上获取,尝试直接在设备上的Safari中访问它.

  4. ios – Xcode Bot:如何在post触发器脚本上获得.ipa路径?

    我正在使用机器人来存档iOS应用程序,我需要获取.ipa产品路径才能将其发布到我们的分发系统中.机器人设置:并使用脚本打印所有env变量,其中不包含ipa文件的路径.此外,一些变量指向不存在的目录,即:XCS_OUTPUT_DIR这里的env变量输出:除此之外,我还能够确认.ipa文件是在另一个文件夹中创建的(/IntegrationAssets//

  5. ios – 使用CocoaPods post install hook将自定义路径添加到HEADER_SEARCH_PATHS

    解决方法在Podfile中定义一个方法:然后在post_install中调用该方法:

  6. iOS7 Safari中的全屏模式

    我正在使用SenchaTouch开发移动网站.在iOS7Safari中,我无法创建顶级地址栏和下面的工具栏消失了.Sencha过去常常处理iOS6,但iOS7最近的一些变化导致了这个问题.http://java.dzone.com/articles/safari-ios-7-and-html5我阅读了上面的链接&对于HTML5游戏而言,这似乎也是一个问题.一些其他应用程序.适用于iOS6的旧win

  7. ios – 如何使用新的Apple Swift语言发布JSON

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  8. ios – POST请求使用application / x-www-form-urlencoded

    后端开发人员在POST请求中给出了这些说明:>路线:{url}/{app_name/{controller}/{action}控制器和动作应该是小帽子.>API测试链接:http:****************>请求应该使用POST方法.>参数应通过请求内容体(FormUrlEncodedContent)传递.>参数应该是json格式.>参数是关键的.在协议中没有经验5,我搜索并结束了我的代码.

  9. 从iOS应用程序发送帖子到PHP脚本不工作…简单的解决方案就像

    我之前已经做了好几次了但是由于某些原因我无法通过这个帖子…我尝试了设置为_POST且没有的变量的PHP脚本……当它们未设置为发布时它工作精细.这是我的iOS代码:这里是PHP的一大块,POST变量不在正确的位置?我想这对于更有经验的开发人员来说是一个相当简单的答案,感谢您的帮助!解决方法$_POST是一个数组,而不是一个函数.您需要使用方括号来访问数组索引:

  10. ios – 在HTTPBody中设置NSDictionary并使用POST方法发送

    我想用POST方法调用Web服务.我需要发布一个带有URL的字典.我的Web服务参数如下:以下是我的要求:但是我收到以下错误:服务器拒绝此请求,因为请求实体的格式不受所请求方法所请求资源的支持解决方法请找到以下代码,将数据发布到Web服务.请注意这是我在我的一个申请中使用的样本.希望这可以帮助.从您的评论“服务器拒绝此请求”服务器是否支持JSON或XML格式.

随机推荐

  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找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部