Jquery源码分析---Ajax分析
2010-09-14 13:39:06 来源:WEB开发网头部还有一个If-Modified-Since的属性用来提高效率的。它和”Last-Modified配合起来使用。在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记此文件在服务期端最后被修改的时间,格式类似这样:Last-Modified: Fri, 12 May 2006 18:53:33 GMT
客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 报头,询问该时间之后文件是否有被修改过: If-Modified-Since: Fri, 12 May 2006 18:53:33 GMT 如果服务器端的资源没有变化,则自动返回 HTTP 304 (Not Changed.)状态码,内容为空,这样就节省了传输数据量。
当服务器端代码发生改变或者重启服务器时,则重新发出资源,返回和第一次请求时类似。从而保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。
拦截处理
⑧处是一个send之前的拦截处理,可以通过s. beforeSend(xhr, s)函数的形式传入拦截函数。保证在发送之前确保满足某些条件。在取得返回数据的时候,也可以通过s.dataFilter(data, type);形式来拦截处理data。不过这里主要的作用对data进一步的筛选。
onreadystatechange
⑨处是onreadystatechange的回调处理。这里采用是poll的形式进行处理。它把返回的状态分成status:tiemout-->error-->notmodified-->success—>parsererror这几种。如果status == "success"那么分析这些数据之后再进行last-modified相关的处理。为了不取回没有修改过数据。
分析数据的代码如下:
//处理请求返回的数据
httpData : function(xhr, type, s) {
var ct = xhr.getResponseHeader("content-type"),
xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0,
data = xml? xhr.responseXML : xhr.responseText;
if (xml && data.documentElement.tagName == "parsererror")
throw "parsererror";
//允许一个pre-filtering函数清洁repsonse
if (s && s.dataFilter)
data = s.dataFilter(data, type);
//script时,就运行
if (type == "script") jQuery.globalEval(data);
//json,生成json对象。
if (type == "json") data = eval("(" + data + ")");
return data;
},
如果返回的content-type是xml,html,text等都返回。对script执行jQuery.globalEval来执行它。对于Json类型,通过eval来生成返回的json对象。
// 在全局的范围eval 代码,也就是在<head></head>中
globalEval : function(data) {
data = jQuery.trim(data);
if (data) {
// Inspired by code by Andrea Giammarchi
// http://webreflection.blogspot.com/2007/08/
//global-scope-evaluation-and-dom.html
var head = document.getElementsByTagName("head")[0]
|| document.documentElement,
script = document.createElement("script");
script.type = "text/javascript";
if (jQuery.browser.msie) script.text = data;
else script.appendChild(document.createTextNode(data));
// Use insertBefore instead of appendChild to circumvent an IE6
// bug. This arises when a base node is used (#2709).
head.insertBefore(script, head.firstChild);
head.removeChild(script);
} },
①②③④⑤⑥⑦⑧⑨⑩
文章来源:http://jljlpch.javaeye.com/category/37744
更多精彩
赞助商链接