前言

ajax 即“Asynchronous JavaScript and XML”(异步的JavaScript和XML)。现在这个词的覆盖面有所扩展,把允许浏览器与服务器通信而无需刷新当前页面的技术都涵盖在内。

传统的Web应用遵循一种请求/响应模式。如果没有Ajax,对于每个请求都会重新加载整个页面(或者利用IFRAME,则是部分页面)。原来查看的页面会放到浏览器的历史栈中,而用XHR对象做出的请求则不会记录在浏览器的历史中。

XMLHttpRequest对象

XMLHttpRequest 对象用于在后台与服务器交换数据。所有现代的浏览器都支持XMLHttpRequest 对象。使用它可以不加载页面的情况下更新网页,并且可以在加载后从服务器请求或者获取数据等等。

创建XmlHttpRequest对象的方法很简单:

xmlhttp=new XMLHttpRequest();

老版本的Internet Explorer (IE5 和 IE6)使用 ActiveX 对象:

xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

创建完成之后,可以使用XMLHttpRequest的若干方法来处理http请求:

  • open(method,url,async,username,password) 初始化一个XMLHttpRequest对象

    method代表发送请求的HTTP方法(GET,POST,PUT,DELETE或HEAD);

    uri参数用于指定XMLHttpRequest对象把请求发送到的服务器相应的URI;

    async参数指定是否请求是异步的-缺省值为true;

    对于要求认证的服务器,可以提供可选的用户名和口令参数。

  • send([content]) 把请求发送到服务器。

    content代表一个可选的参数,该参数可以包含可变类型的数据,是要发送到服务器的内容,通常在POST方法的时候使用。

  • setRequestHeader(DOMString header,DOMString value) 设置请求的头部信息。
  • getResponseHeader(DOMString header,value)检索响应的头部值。
  • getAllResponseHeaders()以一个字符串形式返回所有的响应头部。

大概常用的就这么几个。它们之间是有调用顺序的,依据就是XMLHttpRequest对象的状态属性readyState,它共有5个状态:

0 已经创建一个XMLHttpRequest对象,但是还没有初始化。
1 已经调用了open()方法并且XMLHttpRequest已经准备好把一个请求发送到服务器。
2 已经通过send()方法把一个请求发送到服务器端,但是还没有收到一个响应。
3 已经接收到HTTP响应头部信息,但是消息体部分还没有完全接收结束。
4 响应已经被完全接收。

因此顺序是 0--open--1--setRequestHeader--send--2--响应--3--完成--4。

readyState值的改变将会激发一个readystatechange事件,可以使用onreadystatechange属性来注册该回调事件处理器。

还有几个常用的属性:

  • responseText  接收到的http响应的文本内容;
  • responseXML  接收到的http响应的XML内容,它是一个文档接口类型的对象,用来描述被分析的文档。如果文档不能被分析,那么responseXML的值将为null。
  • status  描述了HTTP状态代码
  • statusText  描述了HTTP状态代码文本

下面是一个小例子:

function createRequest() {try {request = new XMLHttpRequest();} catch (tryMS) {try {request = new ActiveXObject("Msxml2.XMLHTTP");} catch (otherMS) {try {request = new ActiveXObject("Microsoft.XMLHTTP");} catch (failed) {request = null;}}}    return request;
}
function showTab(){var request=createRequest();if(request==null){alert("Unable to create request");return;}request.onreadystatechange=showSchedule;request.open("GET",selectedTab+".html",true);request.send(null);}function showSchedule(){if(request.readyState==4 && request.status==200){var content=document.getElementById("content");content.innerHTML=request.responseText;}}

JQuery Ajax

基本的内容都在这里了:http://api.jquery.com/category/ajax/

可以看出,总共有四个类别:全局ajax事件处理器,有用的帮助函数,相对底层的接口,通用的方法。

通用方法

首先最常用的就是第四种,这些函数的调用层次更高,更加通用。有以下几个函数:

jQuery.get( url [, data ] [, success(data, textStatus, jqXHR) ] [, dataType ] )

参数很简单了:请求的url,携带的参数,请求成功的回调函数,期望得到的数据类型(xml, json, script, or html)

函数的返回值是一个jqXHR,也就是jquery的XMLHttpRequest,是jquery对XMLHttpRequest对象的封装,它实现了Promise接口,可以链式的绑定诸如done()、fail()、always()方法。

jQuery.post( url [, data ] [, success(data, textStatus, jqXHR) ] [, dataType ] )

除了使用HTTP POST方法发送请求之外,和jQuery.get方法大致一样。

.load( url [, data ] [, complete(responseText, textStatus, XMLHttpRequest) ] )

首先这里的调用者不是"JQuery”或者$了,而是jquery对象。之所以这样做就是将返回的HTML放到函数调用者的元素中。

回调函数complete是在获取到响应并把它插入到相应的元素中之后才开始执行的。

值得注意的是,可以通过url参数获取服务器上某个文档的某一个部分,例如:

$('#result').load('ajax/test.html #container');

jquery首先获取到服务器上的网页ajax/test.html,然后解析这个文档得到id为container的元素,然后将它插入到本地页面id为result的元素中,剩余的部分就弃之不用了。

还有一点,如果返回的是一段javascript脚本代码,那么若参数url不带选择表达式后缀,那么就会执行,如果带了后缀,则不会被执行。

load方法默认使用 GET 方式来传递的,如果data参数有传递数据进去,就会自动转换为POST方式。

jQuery.getJSON( url [, data ] [, success(data, textStatus, jqXHR) ] )

相当于将dataType设置为了json而已。如果url中包含了类似于字符串callback=?,那么请求将会作为jsonp对待,jsonp是为了解决js跨域请求的问题。什么是跨域呢,说白了就是域名a下的js不能操作域名b下的对象。

跨域这个问题我也想了很久,我觉得主要有两点:1.发送http请求获取文件当然可以,比如在浏览器中输入域名b下的url,这当然无可厚非,如果不能访问那放到web服务器中还有什么用。但是你要用javascript操作,比如ajax请求域名b下的url,这就不行了,这是出于安全性的考虑。2.为什么不安全呢,比如你在用户X的主页上使用某种方法嵌入了一段js,这段js获取了cookie以及其他一些用户信息。然后当用户X登陆后,你的js采用ajax将cookie对象发送给了你的服务器。如果没有跨域限制,那么你的服务器就有了X的cookie了,然后你就可以模仿他登录了。但是有了跨域,js就不能发送cookie到你的服务器了。关于跨域的问题这里有两篇写的非常好的博客:http://zciii.com/blogwp/crossdomain/和http://www.cnblogs.com/rainman/archive/2011/02/20/1959325.html。

但是有时候非得跨域不可,就可以使用jsonp解决。js虽然不能直接访问其他域下的数据,但是script,img,iframe标签都可以引用不同域名下的文件。那么我们首先定义一个本地的回调函数callback好了,然后将上面某个标签的src设置为服务器的js,回调函数的名字作为其中的参数,接着服务器获取了数据data,然后调用callback(data)。这样就实现了跨域。哎,又找到一篇相当好的介绍jsonp博客,http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html,它怎么解释的那么透彻呢?

jQuery.getScript( url [, success(script, textStatus, jqXHR) ] )

相当于把dataType设置为了script。

Event Handler

主要有这么几个:

.ajaxComplete(),.ajaxError(),.ajaxSend(),.ajaxStart(),.ajaxStop(),.ajaxSuccess()

看名字就知道是什么事件了,也就不多说了。

Helper Function

serialize() : 序列化表单内容为字符串。

序列化之后的字符串大概就是这个样子:single=Single&multiple=Multiple&multiple=Multiple3&check=check2&radio=radio1

serializeArray() : 序列化表单元素返回 JSON 数组。

即返回一个[{name:”single”,value:”Single”},…]的形式。

jQuery.param( obj ) 将obj进行序列化

obj可以是一个json数组或者对象。

var myObject={ a: { b:1,c:2 }, d: [3,4,{ e:5 }] };
var recursiveEncoded = $.param(myObject); //"a%5Bb%5D=1&a%5Bc%5D=2&d%5B%5D=3&d%5B%5D=4&d%5B2%5D%5Be%5D=5"
var recursiveDecoded = decodeURIComponent($.param(myObject)); //"a[b]=1&a[c]=2&d[]=3&d[]=4&d[2][e]=5"

Low-Level Interface

jQuery.ajax( url [, settings ] ) 和 jQuery.ajax( [settings ] )

settings这个参数的内容太多了,包括accepts,async,beforeSend,cache,complete,contents,contentType,context,converters,crossDomain,data,dataFilter,dataType,error,global,headers,ifModified,isLocal,jsonp,jsonpCallback,mimeType,password,processData,scriptCharset,statusCode,success,tiemout,traditional,type,url,username,xhr,xhrFields。

太多了,实际用的时候根本不可能同时用这么多,所以用的时候再查吧。

转载于:https://www.cnblogs.com/cubika/p/3188183.html

Javascript Step by Step - 03相关推荐

  1. Step by Step Setup Git Server on Windows with CopSSH + msysGit and Integrate Git with Visual Studio

    Introduction First of all, let me clarify that Git doesn't need to specify the side for client and s ...

  2. Cisco Wireless Controller 5508 Configuration Step by Step – Part 1 (CLI and GUI Access, Upgrade)

    As the industry's most deployed controller, the Cisco 5500 Series Wireless Controller provides the h ...

  3. WPF MVVM 架构 Step By Step(2)(简单的三层架构示例及粘合代码GLUE code)

    WPF MVVM 架构 Step By Step(2)(简单的三层架构示例及粘合代码GLUE code) 原文:WPF MVVM 架构 Step By Step(2)(简单的三层架构示例及粘合代码GL ...

  4. 【Step By Step】将Dotnet Core部署到Docker上

    [Step By Step]将Dotnet Core部署到Docker上 原文: [Step By Step]将Dotnet Core部署到Docker上 本教程的前提是,你已经在Linux服务器上已 ...

  5. 【Step By Step】将Dotnet Core部署到Docker下

    一.使用.Net Core构建WebAPI并访问Docker中的Mysql数据库 这个的过程大概与我之前的文章<尝试.Net Core-使用.Net Core + Entity FrameWor ...

  6. python写一个通讯录step by step V3.0

    python写一个通讯录step by step V3.0 更新功能: 数据库进行数据存入和读取操作 字典配合函数调用实现switch功能 其他:函数.字典.模块调用 注意问题: 1.更优美的格式化输 ...

  7. C#2.0实例程序STEP BY STEP--实例二:数据类型

    C#2.0实例程序STEP BY STEP--实例二:数据类型 与其他.NET语言一样,C#支持Common Type Sysem(CTS),其中的数据类型集合不仅包含我们熟悉的基本类型,例如int, ...

  8. 文本分类step by step(二)

    (注:如有转载请标明作者:finallyliuyu, 和出处:博客园) <文本分类 step by step(一)> 在<文本分类step by step(一)>中,我们从处理 ...

  9. 数据库设计Step by Step (9)——ER-to-SQL转化

    2019独角兽企业重金招聘Python工程师标准>>> 引言:前文(数据库设计 Step by Step (8)--视图集成)讨论了如何把局部ER图集成为全局ER图.有了全局ER图后 ...

  10. ActionScript 3.0 Step By Step系列(五):走在面向对象开发的路上,以类为基础去思考编程问题...

    面向对象的程序设计(Object-Oriented Programming,简记为OOP)是一种功能非常强大的编程方法,立意于创建软件重用代码,以类为基础去思考编程问题. ActionScript 3 ...

最新文章

  1. 数据解析_485型风速和风向变送器数据包解析
  2. WCF分布式开发步步为赢(1):WCF分布式框架基础概念
  3. 量子计算时代快了!量子计算机的架构,硬件,软件等都有成果!
  4. linux mono apache2,使用Apache2设置ModMono
  5. 【2014年计划】工作,学习两不误
  6. 半路出家学php可以吗,PHP半路出家(1)_PHP教程
  7. Android xml文件的序列化
  8. Mac安装Homebrew教程
  9. 委托和事件的一些理解笔记
  10. [译]应用内搜索功能实现 Android TV应用程序手册教程十三
  11. PHP安装kafka扩展
  12. [mysql终极优化]之主从复制与读写分离详细设置教程
  13. 抖音超级恶心的滑稽HTML源码
  14. C#.NET发EMAIL的几种方法 MailMessage/SmtpClient/CDO.Message
  15. 仿微信、qq聊天,@好友功能
  16. 网康NS-NGFW防火墙远程RCE 漏洞复现
  17. 思科计算机基础知识,思科路由器基础知识--存储详解
  18. 使用Python获取最新疫情数据,制作可视化动态地图,实时展示各地情况
  19. 图片转文字微信小程序使用方法
  20. 此“备忘录”和彼备忘录一样吗?

热门文章

  1. 用宏定义实现函数值互换
  2. Java中static的作用详解_java中static作用详解
  3. pandas内容像日期的数据如何变成真DataTime,并赋予时间类似的操作
  4. 【解决办法】pandas画出时序数据(股票数据)横轴不是时间
  5. C++多线程简单入门(Windows版本)
  6. php非,PHP实现非对称加密
  7. psycopg2 mysql_使用psycopg2操作PostgreSQL数据库之二
  8. 第二十三讲 解一阶微分方程组
  9. 常见的原生javascript DOM操作
  10. 让人抓头的Java并发(四) 阻塞队列--CPU飙升排查案例