Welcome

首页 / 脚本样式 / jQuery / Jquery源码分析---Ajax分析

Jquery源码分析---Ajax分析2010-12-15prk(彭仁夔)7.1 jquery的ajax常用方法

对于Ajax原理不深入分析。Jquery肯定也 会提供Ajax的实现。对于ajax的请求,可以分成如下的几步:

1、通过 new XMLHttpRequest 或其它的形式(指IE)生成ajax的对象xhr。

2、通 过xhr.open(type, url, async, username, password)的形式建立一个连接。

3、通过setRequestHeader设定xhr的请求头部(request header)。

4、通过send(data)请求服务器端的数据。

5、执行在xhr上注册 的onreadystatechange回调处理返回数据。

任何的lib都是在这几步之上 进行相关扩展而达到自己的功能。这几步之中,对于url,我们要考虑是跨域请 求怎么办,ajax为了安全的考虑不支持跨域请求,那么对于这个问题,Jquery和 Ext都是采用scriptTag的方式。

Jquery主要就是解决上面这问题,之后 就在这个基础之上进行扩展,如getScript,getJson之类的函数。Ajax一个很重 要的任务就是提交form。Jquery Ajax提供了如Prototype的form中 serializeElements把form的元素串行起请求字符串。这是ajax的辅助方法。

对于ajax的应用,不管对返回的数据进行如何的处理,其最终目的还是 得落在页面的显示上,也是某一个或一些dom元素上。那么我从这个需要改变内 容的dom元素(集合)出发,通过ajax去获得数据进行一些处理最终填充到给定 的元素中。这和prototype中Ajax.Updata相似。

load

Jquery对象 的load(url, params, callback)函数就是完成这类似的工作的。

// 载入远程 HTML 文件代码并插入至 DOM 中。
// 默认使 用 GET 方式 - 传递附加参数时自动转换为 POST 方式。jQuery 1.2 中,
//可以指定选择符,来筛选载入的 HTML 文档,DOM 中将仅插入筛选出的 HTML 代码。
// 语法形如 "url #some > selector"。
load : function(url, params, callback) {
if (typeof url != "string") return this._load(url);
var off = url.indexOf(" ");// 找到第一个空格处
if (off >= 0) { ①
var selector = url.slice(off, url.length);// 第一个空格之后的字符
url = url.slice(0, off);// 第一个空格之前的字符
}
callback = callback || function() {
};
var type = "GET";// 默认的是get类型
// 这里是判断第二参数,如果是 fn,那么就是指callback
// 如果是object,那么就是指data.load(url, [data],[callback])
if (params)
if (jQuery.isFunction (params)) {
callback = params; params = null;}
else if (typeof params == "object") {
params = jQuery.param(params);type = "POST"; ②
}
var self = this;
jQuery.ajax( {//Ajax请求 ③
url : url, type : type,dataType : "html",data : params,
complete : function(res, status) {
// 成功就注射html到所有匹配的元素中
if (status == "success" || status == "notmodified")
// selector是否指定?没有的话就是全部的内容
// 指定的话 ,就是生成dom文档的形式,之后在中间找到满足条件的元素。
// 这中间删除 scripts 是避免IE中的 "Permission Denied" 错误
self.html(selector ? jQuery("<div/>") ④
.append(res.responseText.replace(/<script(.|s) *?/script>/g, ""))
.find(selector) : res.responseText);
self.each(callback, [res.responseText, status, res]); // 执行回调⑤
}
});
return this;
},