WEB开发网
开发学院网页设计JavaScript Jquery源码分析---Ajax分析 阅读

Jquery源码分析---Ajax分析

 2010-09-14 13:39:06 来源:WEB开发网   
核心提示: 头部还有一个If-Modified-Since的属性用来提高效率的,它和”Last-Modified配合起来使用,Jquery源码分析---Ajax分析(8),在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,对于Json类型,通过eval来生成返回的json对象

头部还有一个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

上一页  3 4 5 6 7 8 

Tags:Jquery 源码 分析

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接