YUI 研究 -- Connection Manager 模块

来源:互联网 发布:数据分析部门架构 编辑:程序博客网 时间:2024/05/18 02:00
YAHOO.util.Connect XMLHttpRequest的封装,关注跨浏览器和请求状态等问题
自定义事件触发过程:
startEvent
completeEvent
successEvent、failureEvent、uploadEvent
如果调用了abort:
startEvent
abortEvent
failureEvent

YAHOO.util.Connect.asyncRequest(method, uri, callback, postData) 发起异步请求
根据是否需要上传获取相应类型的连接对象;
如果需要上传,则调用uploadFile并返回;
如果只是需调用了setForm而没有上传文件的需要,则把_sFormData、postData和uri根据需要拼接起来;
默认会在XHR连接上加上头信息“X-Requested-With:XMLHttpRequest”,表明这个请求是通过Connection Manager发出的;
默认会在使用post方法的时候加上头信息Content-Type:application/x-www-form-urlencoded”;

YAHOO.util.Connect.setForm(formId, isUpload, secureUri) 收集表单中的字段信息构造字符串
如果isUpload==true,创建iframe;
如果遇到select元素,则遍历它的options,找到selected==true的option;在IE,用option.attributes['value'].specified,其他用option.hasAttribute('value')判断是否设置了value属性,如果没设置则用text代替value进行字符串组合
radio和checkbox都是用checked判断
如果是submit而且是第一个检测到的submit:如果
_hasSubmitListener存在,则取_submitElementValue中的值填入字符串
,否则,把它的name和value加入字符串。就是说如果在加载的时候_hasSubmitListener===false,表单中第一个被检测到的submit的值会被提交。_hasSubmitListener主要用户解决一个表单中有多个submit的情况。
由于此方法开始时会调用resetFormState,所以它不能保存一个以上的表单信息。

YAHOO.util.Connect.abort(o, callback, isTimeout) 中断一个请求事务
在XHR的事务中,清楚readystate和事务timeout定时器;
在上传文件事务中,清楚iframe和timeout定时器;
如果上面的清楚操作成功,则触发abortEvent,并调用handleTransactionResponse生成返回对象。

YAHOO.util.Connect.initHeader(label, value, isDefault) 添加头信息
如果isDefault为true,则设置全局头信息;否则设置单事务头信息;
如果有相同的label头信息存在,则在它的值前加上新值和逗号。

YAHOO.util.Connect.isCallInProgress(o) 判断请求事务是否还在进行中
在XHR请求的事务中,如果o.conn还没被构析,而且o.conn.readystate!=0而!=4,则返回true;
在上传文件事务中,如果用于上传的iframe还没被删除,则返回true;
其他情况返回false。

YAHOO.util.Connect.createFrame(secureUri) 创建用于上传的iframe
创建的iframe的id为‘yuiIO’+_transaction_id;
在IE中不能设置通过createElement创建的对象的属性;
在IE的SSL环境中不设置iframe的src属性会抛出安全异常;
把iframe设置绝对布局,并把它设为坐标[-1000,-1000];
把加到body所有子元素的末尾。

YAHOO.util.Connect.appendPostData(postData) 在upload的时候把postData转化为hidden字段插入_formNode

YAHOO.util.Connect.uploadFile(o, callback, uri, postData) 上传文件表单
把表单原本的action、method和target保存起来,然后把它们分别设置成uri、post和新创建的iframe的id
屏蔽了IE的encoding和非IE的entype,并把它们设置成
multipart/form-data
调用appendPostData设置表单的隐藏字段,然后提交表单;

触发startEvent,设置timeout定时器和清除appendPostData创建的隐藏字段;
回复表单原来的值并重置表单状态;
创建callback并注册在新创建的iframe的load事件中;
在callback中,先后触发completeEvent和uploadEvent,并把iframe给除掉;
在上传这样情况中并不能返回对象并不能获得头信息。

YAHOO.util.Connect._hasSubmitListener 是否已经注册的检测submit事件的处理器
模 块加载时执行一匿名方法,此方法判断Event模块是否已加载成功,如果加载成功,则在document上注册一个监听click的事件,如果事件的 target.type="submit",则把_submitElementValue设置为target.name+"="+ target.value,并返回true;否则返回false。

YAHOO.util.Connect.createXhrObject(transactionId) 构造一个XHR对象
在非IE浏览器中,使用XMLHttpRequest;
在IE中,使用ActiveXObject。ActiveXObject构造方法参数的值定义在数组_msxml_progid中,可以通过setProgId(id)把新值置于_msxml_progid前端。

YAHOO.util.Connect.getConnectionObject(isFileUpload) 构造一个有效连接对象
如果isFileUpload==false,调用createXhrObject并返回其结果;
否则,构造一个空对象并设置他的tId为_transaction_id和isUpload为true;
_transaction_id++。

YAHOO.util.Connect.initCustomEvents(o, callback) 创建单事务事件并注册监听器
创建的单事务事件会保存在o中。在一个异步请求事务的整个周期中,会先触发在Connect中的全局事件,再触发单事务事件

YAHOO.util.Connect.handleReadyState(o, callback) 处理连接状态
创建一个定时器监听o.conn.readyState==4的状态;

o.conn.readyState==4,触发completeEvent,并调用handleTransactionResponse
定时器默认值为50,可通过setPollingInterval设置。(为啥不用onreadystatechange呢?)

YAHOO.util.Connect.handleTransactionResponse(o, callback, isAbort) 处理返回结果并判断事务是否成功
如果callback==null,条用releaseObject并返回;
如果200<=o.conn.status<=300或==1223,则执行事务正确处理,触发successEvent;
否则执行错误处理并触发failureEvent。

YAHOO.util.Connect.createResponseObject(o, callbackArg) 创建返回对象
装配连接头信息和其他相关属性。

YAHOO.util.Connect.createExceptionObject(o, callbackArg, isAbort) 创建异常对象
如果是通讯错误,o.status=0;
如果是命令中断,o.status=1。


YAHOO.util.Connect.setProgId(id) 添加ActiveX的签名

YAHOO.util.Connect.setDefaultPostHeader(b) 设置是否使用默认的Post方法头信息
默认的Post方法头信息为'application/x-www-form-urlencoded; charset=UTF-8'

YAHOO.util.Connect.setDefaultXhrHeader(b) 设置是否使用默认的异步请求头信息
默认的异步请求头信息为'XMLHttpRequest'

YAHOO.util.Connect.setHeader(o) 把保存起来的头信息设置在o.conn中

YAHOO.util.Connect.releaseObject(o) 构析连接对象

YAHOO.util.Connect.resetFormState() 重置与表单有关的状态
重置_isFormSubmit、_isFileUpload、_formNode和_sFormData。

YAHOO.util.Connect.resetDefaultHeaders() 重置默认头信息
包括_has_default_headers=false和_default_headers={}。