点击蓝字
关注我们
传统上,网页需要重新加载才能更新内容。对于基于网络的电子邮件来说,这意味着用户必须手动重新加载他们的收件箱,以检查和查看他们是否有新邮件。这有很大的缺点:速度慢,而且需要用户输入。当用户重新加载他们的收件箱时,服务器必须重新构建整个网页,并重新发送所有的HTML、CSS、JavaScript以及用户的电子邮件。这是非常低效的。理想情况下,服务器应该只需要发送用户的新邮件,而不是整个页面。到了2003年,所有的主流浏览器都解决了这个问题,采用了XMLHttpRequest(XHR)对象,允许浏览器与服务器进行通信,而不需要重新加载页面。
XMLHttpRequest对象是一种叫做Ajax(异步JavaScript和XML)的技术的一部分。使用Ajax,数据就可以通过XMLHttpRequest API在浏览器和服务器之间传递,而不需要重新加载网页。随着XMLHttpRequest对象的广泛采用,很快就可以构建像Google Maps和Gmail这样的Web应用程序,使用XMLHttpRequest来获取新的地图磁贴或新的电子邮件,而无需重新加载整个页面。
Ajax请求是由JavaScript代码触发的;你的代码向一个URL发送一个请求,当它收到响应时,可以触发一个回调函数来处理响应。因为请求是异步的,所以当请求被处理时,你的其他代码会继续执行,所以必须使用回调来处理响应。
不幸的是,不同的浏览器对Ajax API的实现方式不同。通常情况下,这意味着开发人员必须考虑到所有不同的浏览器,以确保Ajax能够普遍工作。幸运的是,jQuery提供了Ajax支持,它抽象地消除了痛苦的浏览器差异。它既提供了功能齐全的$.ajax()方法,也提供了简单方便的方法,如$.get()、$.getScript()、$.getJSON()、$.post()和$().load()。
尽管名为 "Ajax",但大多数jQuery应用程序实际上并不使用XML;相反,它们以纯HTML或JSON(JavaScript对象符号)的形式传输数据。
一般来说,Ajax不能跨域工作。例如,一个从example1.com加载的网页无法向example2.com发出Ajax请求,因为这将违反相同的来源策略。作为一种解决方法,JSONP(带填充的JSON)使用标签从另一个域加载包含任意JavaScript内容和JSON的文件。最近,浏览器已经实现了一种叫做跨源资源共享(CORS)的技术,它允许向不同域的Ajax请求。
关键概念
正确使用Ajax相关的jQuery方法,需要先了解一些关键概念。
GET vs. POST
向服务器发送请求的两种最常见的 "方法 "是GET和POST。了解每种方法的正确应用是很重要的。
GET方法应该用于非破坏性操作--也就是说,你只是从服务器上 "获取 "数据,而不是改变服务器上的数据的操作。例如,对搜索服务的查询可能是一个GET请求。GET请求可能会被浏览器缓存,这可能会导致不可预知的行为,如果你没有想到的话。GET请求一般会在一个查询字符串中发送所有数据。
POST方法应该用于破坏性操作--也就是在服务器上改变数据的操作。例如,用户保存一篇博客文章应该是一个POST请求。POST请求一般不会被浏览器缓存;查询字符串可以是URL的一部分,但数据往往会作为post数据单独发送。
数据类型
jQuery通常需要一些指令来说明你期望从Ajax请求中得到的数据类型;在某些情况下,数据类型是由方法名指定的,而在其他情况下,它是作为配置对象的一部分提供的。有几个选项。
text用于传输简单的字符串。
html用于传输要放在页面上的HTML块。
script用于添加一个新的脚本到页面。
json用于传输JSON格式的数据,可以包括字符串、数组和对象。
注意:从jQuery 1.4开始,如果你的服务器发送的JSON数据没有正确的格式化,请求可能会无声地失败。参见http://json.org,了解正确格式化JSON的细节,但作为一般规则,使用内置的语言方法在服务器上生成JSON以避免语法问题。
jsonp用于从另一个域传输JSON数据。
xml用于在自定义XML模式中传输数据。
在大多数情况下考虑使用JSON格式,因为它提供了最大的灵活性。它对于同时发送HTML和数据特别有用。
异步Ajax的异步性让很多jQuery新用户措手不及。因为Ajax调用默认是异步的,所以响应不是立即可用。响应只能使用回调来处理。所以,举例来说,下面的代码将无法工作。
var response; $.get( "foo.php", function( r ) { response = r;}); console.log( response ); // undefined
相反,我们需要向我们的请求传递一个回调函数;这个回调将在请求成功时运行,此时我们可以访问它返回的数据(如果有的话)。
$.get( "foo.php", function( response ) { console.log( response ); // server response});
同源策略和JSONP。在一般情况下,Ajax请求被限制在相同的协议(http或https),相同的端口,和相同的域名作为页面的请求。这个限制不适用于通过jQuery的Ajax方法加载的脚本。
注意:Internet Explorer小于10的版本不支持跨域AJAX请求。
另一个例外是针对另一个域的JSONP服务的请求。在JSONP的情况下,服务的提供者已经同意用一个脚本来响应你的请求,这个脚本可以使用标签加载到页面中,从而避免了同源的限制;这个脚本将包括你所请求的数据,并包裹在你提供的回调函数中。
Ajax和FirebugFirebug(或 Chrome 或 Safari 中的 Webkit Inspector)是处理 Ajax 请求的重要工具。您可以在 Firebug 的 Console 选项卡(以及 Webkit Inspector 的 Resources > XHR 面板)中查看 Ajax 请求的发生情况,您还可以单击请求以展开请求并查看请求头、响应头、响应内容等详细信息。如果某个 Ajax 请求没有按照预期进行,那么首先要查找的就是该请求的问题所在。
球分享
球点赞
球在看