/*
*这个文件是对xmlhttp异步请求进行了简单的封装,
*主要是将prototytp进行了简化,如果要使用复杂的功能可以使用prototype的ajax.js
*外部使用时,主要调用方式为
* var myAjax=new Ajax.Request(
url,
{
method: 'get',
asynchronous: true,
onSuccess: function(xmlHttp)
{
},
onFailure:function(xmlHttp){
},
onException:function(exception){
}
}
);
另可使用myAjax.header()和myAjax.evalResponse();
其他的都为内部调用函数,外部尽量不要使用。
*/
/*
*基础函数
*Class.create()
*Try.these()
*Object.extend()
*Function.prototype.bind
*/
var Class = {
create: function() {
return function() {
this.initialize.apply(this, arguments);
}
}
};
var Try = {
these: function() {
var returnValue;
for (var i = 0; i < arguments.length; i++) {
var lambda = arguments[i];
try {
returnValue = lambda();
break;
} catch (e) {}
}
return returnValue;
}
};
var Abstract = new Object();
Object.extend = function(destination, source) {
for (property in source) {
destination[property] = source[property];
}
return destination;
};
Function.prototype.bind = function(object) {
var __method = this;
return function() {
__method.apply(object, arguments);
}
};
/*
*基础ajax类
*封装了一个函数:Ajax.getTransport()返回一个xmlhttp对象
*这个类里的函数一般不使用。
*/
var Ajax = {
getTransport: function() {
return Try.these(
function() {return new ActiveXObject('Msxml2.XMLHTTP')},
function() {return new ActiveXObject('Microsoft.XMLHTTP')},
function() {return new XMLHttpRequest()}
) || false;
}
};
/*
*基础ajax.base类
*封装了三个函数:
*setOptions:设置进行ajax请求的参数
*responseIsSuccess:判断异步请求返回是否成功
*responseIsFailure:判断异步请求返回是否失败
*这个类里的函数也没有必要在实际中使用,只有在扩展是才会使用到
*/
Ajax.Base = function() {};
Ajax.Base.prototype = {
setOptions: function(options) {
this.options = {
method: 'post',//异步请求方法,可以为get和post
asynchronous: true, //设置是否为异步方式发送,
parameters: '' //传递参数,参数都是url编码格式a=valueOfA&b=valueOfB
}
Object.extend(this.options, options || {});//以上三个属性为异步请求的基本属性。
},
responseIsSuccess: function() {
return this.transport.status == undefined
|| this.transport.status == 0
|| (this.transport.status >= 200 && this.transport.status < 300);
},
responseIsFailure: function() {
return !this.responseIsSuccess();
}
};
Ajax.Request = Class.create();
/*
*定义了xmlhttp请求的状态。
*0 (未初始化) 对象已建立,但是尚未初始化(尚未调用open方法)
*1 (初始化) 对象已建立,尚未调用send方法
*2 (发送数据) send方法已调用,但是当前的状态及http头未知
*3 (数据传送中) 已接收部分数据,因为响应及http头不全,这时通过responseBody和responseText获取部分数据会出现错误,
*4 (完成) 数据接收完毕,此时可以通过通过responseBody和responseText获取完整的回应数据
*/
Ajax.Request.Events = ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
/*
*Ajax.Request对象,需要实例化对象,
*
*/
Ajax.Request.prototype = Object.extend(new Ajax.Base(),{
initialize: function(url, options) {
this.transport = Ajax.getTransport();//返回xmlhttp对象
this.setOptions(options);//设置请求的参数,在初始化时写
this.request(url);//进行异步请求
},
request: function(url) {
var parameters = this.options.parameters || '';
if (parameters.length > 0) parameters += '&_=';
try {
this.url = url;
/*如果是get方法的化,就将parameters里的内容添加到url里*/
if (this.options.method == 'get' && parameters.length > 0)
this.url += (this.url.match(/\?/) ? '&' : '?') + parameters;
/*调用xmlhttp的请求函数,进行请求*/
this.transport.open(this.options.method, this.url,
this.options.asynchronous);
/*如果是异步请求,对onreadystatechange绑定函数,对于为什么要用定时器,没10ms将状态设为Loading,我也没有明白。*/
if (this.options.asynchronous) {
this.transport.onreadystatechange = this.onStateChange.bind(this);
setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10);
}
this.setRequestHeaders();//设置请求里的头部信息,包括编码等信息
/*对与post方式请求,也可以通过options里的postBody来设,这里就将postbody放到参数里进行传递*/
var body = this.options.postBody ? this.options.postBody : parameters;
/*发送post数据*/
this.transport.send(this.options.method == 'post' ? body : null);
} catch (e) {
this.dispatchException(e);
}
},
setRequestHeaders: function() {
var requestHeaders = ['X-Requested-With', 'XMLHttpRequest'];
if (this.options.method == 'post') {
requestHeaders.push('Content-type',
'application/x-www-form-urlencoded');
/* Force "Connection: close" for Mozilla browsers to work around
* a bug where XMLHttpReqeuest sends an incorrect Content-length
* header. See Mozilla Bugzilla #246651.
*/
if (this.transport.overrideMimeType)
requestHeaders.push('Connection', 'close');
}
if (this.options.requestHeaders)
requestHeaders.push.apply(requestHeaders, this.options.requestHeaders);
for (var i = 0; i < requestHeaders.length; i += 2)
this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]);
},
/*
*状态改变时,执行respondToReadyState,判断当状态为1时不执行。
*/
onStateChange: function() {
var readyState = this.transport.readyState;
if (readyState != 1)
this.respondToReadyState(this.transport.readyState);
},
/*
*返回异步请求返回文件的头部信息,name表示名字,函数返回参数值
*/
header: function(name) {
try {
return this.transport.getResponseHeader(name);
} catch (e) {}
},
/*
*如果返回header信息里包括X-JSON/xxx,则会执行xxx的内容
*不是很明白这里,为什么要eval
*/
evalJSON: function() {
try {
return eval(this.header('X-JSON'));
} catch (e) {}
},
/*
*很简单的函数,如果返回Content-type为text/javascript,则会调用此函数进行执行,我认为这处用途不大
*/
evalResponse: function() {
try {
return eval(this.transport.responseText);
} catch (e) {
this.dispatchException(e);
}
},
/*
*根据返回的状态决定该执行的步骤
*/
respondToReadyState: function(readyState) {
var event = Ajax.Request.Events[readyState];
var transport = this.transport, json = this.evalJSON();
if (event == 'Complete') {
/*
*此处如果状态处于完成状态则会进行分析分别调用onSuccess和onFailure,所以一般onComplete不调用为好
*/
try {
(this.options['on' + this.transport.status]
|| this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')]
|| function(){})(transport, json);
} catch (e) {
this.dispatchException(e);
}
/*此处对返回js进行了eval*/
if ((this.header('Content-type') || '').match(/^text\/javascript/i))
this.evalResponse();
}
try {
(this.options['on' + event] || function(){})(transport, json);
} catch (e) {
this.dispatchException(e);
}
/* Avoid memory leak in MSIE: clean up the oncomplete event handler */
if (event == 'Complete')
this.transport.onreadystatechange = function(){};
},
/*
*错误时调用,一般外部使用onException:function(){}
*/
dispatchException: function(exception) {
(this.options.onException || function(){})(this, exception);
}
}
);
相关推荐
例解Prototype框架.doc 第21章__使用Prototype框架.pdf Prototype源码注释版.pdf proprototype源码分析.doc totype_1.3_源码解读.txt
通过深入分析 Prototype 的源码,我们可以学习到如何高效地编写 JavaScript 代码,理解面向对象编程在 JavaScript 中的应用,以及如何利用原型链实现继承和扩展原生对象。这些知识对于提升 JavaScript 编程技巧和...
- **Prototype源码分析**:通过阅读源码,可以学习到JavaScript设计模式、模块化开发以及如何优化JavaScript性能等方面的知识。 - **Prototype API**:API文档是学习如何使用Prototype的关键资源,它会详细介绍每个...
`Prototype.js` 源码分析 `prototype-1.6.0.2.js` 文件包含了 Prototype 的源代码。通过阅读源码,你可以了解到内部实现细节,如事件处理、动画效果、DOM 缓存等。理解这些实现可以帮助你优化代码性能,解决兼容性...
通过以上对 Prototype 1.3 源码的分析可以看出,Prototype 旨在通过简洁高效的 API 来简化前端开发工作,尤其是针对 DOM 操作、事件处理以及类型操作等方面。这些核心功能的实现不仅提高了开发效率,还增强了代码的...
通过阅读和分析 Prototype 1.5 版本的源码,开发者不仅可以学习到 JavaScript 的高级技巧,还能领略到优秀的代码设计和工程实践。同时,了解 Prototype 的源码也有助于理解其他 JavaScript 库和框架,如 jQuery 和 ...
分析源码是提升技能的重要途径。可以逐行阅读 Prototype 的源码,理解其内部的工作原理,掌握如何优化和扩展 JavaScript 库。此外,结合实际项目,将学习到的知识应用到实践中,才能真正提升开发效率。 总结,...
prototype资料可能包含Prototype的文档、教程或源码分析,帮助开发者深入了解其设计理念和用法。 1. 面向对象:Prototype扩展了JavaScript的原型链,引入类(Class)的概念,便于创建复杂的对象结构。 2. DOM操作:...
prototype源码下载,没有压缩过,请各位看官下载分析理解
`prototype.js`源码分析 ```javascript // 假设这是原型.js的一部分 function MyObject() {} // 添加一个属性到原型 MyObject.prototype.name = 'John Doe'; // 添加一个方法到原型 MyObject.prototype.sayHello...
通过分析Prototype 1.4.0的源码,我们可以更深入地理解JavaScript的设计模式和最佳实践,提升我们的编程技巧。尽管随着技术的发展,新的库和框架层出不穷,但Prototype的许多设计理念和方法仍被广泛借鉴,对学习和...
jQuery 是一个非常优秀的 JS 库,与 Prototype,YUI,Mootools 等众多的 Js 类 库相比,它剑走偏锋,从web开发的...这就是本源码分析的原因,让所有使用 jQuery 的读者,能快速 上手 jQuery的源码,并在开发中得心应用。
### jQuery源码分析关键知识点详解 #### 一、前言 在深入了解jQuery源码之前,有必要先简要介绍一下jQuery的基本情况及其对JavaScript编程领域的重要意义。jQuery作为一个轻量级、功能丰富的JavaScript库,在Web...
这就是本源码分析的原因,让所有使用jQuery的读者,能快速上手jQuery的源码,并在开发中得心应用。 Jquery的网络资源丰富,但Baidu了很久,很难找到那种完全深入地分析Jquery源码的文稿。倒是Jquery的开发者,John ...
这个资源"23种设计模式源码分析"显然是一个深入探讨设计模式的材料,涵盖了软件设计中的核心概念。在本文中,我们将详细解析这23种设计模式,并通过源码分析来加深理解。 1. **创建型模式**(Creational Patterns)...
在JavaScript中,`prototype`是一个核心...总的来说,这篇"prototype学习笔记"深入讲解了JavaScript中的原型和继承机制,结合源码分析和实用工具,帮助开发者更全面地掌握这一核心概念,并能够在实际项目中灵活运用。
7. **源码分析** 在 Prototype 1.7.2 的源码中,可以看到许多精心设计的优化和调试辅助功能,例如完整的注释,这使得开发者能够深入理解每个函数的工作原理,从而更好地定制和扩展框架。 8. **兼容性** 1.7.2 ...
### jQuery源码分析 #### 一、概述 jQuery作为一个卓越的JavaScript库,以其简洁高效的特性在前端开发领域占据了一席之地。与Prototype、YUI、Mootools等其他JavaScript库相比,jQuery更加注重实用性,去除了一些...
在深入探讨Spring源码分析流程之前,我们先要理解Spring框架的基本概念。Spring是一个轻量级的Java企业级应用框架,它提供了丰富的功能,包括依赖注入(DI)、面向切面编程(AOP)、数据访问、事务管理等。Spring的...
本篇文章将深入探讨如何在Prototype中处理XML数据,以及相关的源码分析。** **一、Prototype库中的Ajax基础** Prototype是一个流行的JavaScript库,它为JavaScript提供了许多实用的工具和扩展,包括Ajax功能。在...