Jquery源码分析---Ajax分析。

来源:互联网 发布:淘宝复制链接发给好友 编辑:程序博客网 时间:2024/06/09 19:50

 

Jquery源码分析---Ajax分析

豆豆网   技术应用频道    2009年01月21日 【字号:小 中 大】 收藏本文

关键字: FCKEditor 闭包 Dojo 在线编辑器 position

Jquery源码分析---Ajax分析。

  头部还有一个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);
      }   },

原创粉丝点击