📄 connection.js
字号:
}, /** * @description Method for initiating an asynchronous request via the XHR object. * @method asyncRequest * @public * @static * @param {string} method HTTP transaction method * @param {string} uri Fully qualified path of resource * @param {callback} callback User-defined callback function or object * @param {string} postData POST body * @return {object} Returns the connection object */ asyncRequest:function(method, uri, callback, postData) { var o = (this._isFileUpload)?this.getConnectionObject(true):this.getConnectionObject(); var args = (callback && callback.argument)?callback.argument:null; if(!o){ return null; } else{ // Intialize any transaction-specific custom events, if provided. if(callback && callback.customevents){ this.initCustomEvents(o, callback); } if(this._isFormSubmit){ if(this._isFileUpload){ this.uploadFile(o, callback, uri, postData); return o; } // If the specified HTTP method is GET, setForm() will return an // encoded string that is concatenated to the uri to // create a querystring. if(method.toUpperCase() == 'GET'){ if(this._sFormData.length !== 0){ // If the URI already contains a querystring, append an ampersand // and then concatenate _sFormData to the URI. uri += ((uri.indexOf('?') == -1)?'?':'&') + this._sFormData; } } else if(method.toUpperCase() == 'POST'){ // If POST data exist in addition to the HTML form data, // it will be concatenated to the form data. postData = postData?this._sFormData + "&" + postData:this._sFormData; } } if(method.toUpperCase() == 'GET' && (callback && callback.cache === false)){ // If callback.cache is defined and set to false, a // timestamp value will be added to the querystring. uri += ((uri.indexOf('?') == -1)?'?':'&') + "rnd=" + new Date().valueOf().toString(); } o.conn.open(method, uri, true); // Each transaction will automatically include a custom header of // "X-Requested-With: XMLHttpRequest" to identify the request as // having originated from Connection Manager. if(this._use_default_xhr_header){ if(!this._default_headers['X-Requested-With']){ this.initHeader('X-Requested-With', this._default_xhr_header, true); } } //If the transaction method is POST and the POST header value is set to true //or a custom value, initalize the Content-Type header to this value. if((method.toUpperCase() === 'POST' && this._use_default_post_header) && this._isFormSubmit === false){ this.initHeader('Content-Type', this._default_post_header); } //Initialize all default and custom HTTP headers, if(this._has_default_headers || this._has_http_headers){ this.setHeader(o); } this.handleReadyState(o, callback); o.conn.send(postData || ''); // Reset the HTML form data and state properties as // soon as the data are submitted. if(this._isFormSubmit === true){ this.resetFormState(); } // Fire global custom event -- startEvent this.startEvent.fire(o, args); if(o.startEvent){ // Fire transaction custom event -- startEvent o.startEvent.fire(o, args); } return o; } }, /** * @description This method creates and subscribes custom events, * specific to each transaction * @method initCustomEvents * @private * @static * @param {object} o The connection object * @param {callback} callback The user-defined callback object * @return {void} */ initCustomEvents:function(o, callback) { var prop; // Enumerate through callback.customevents members and bind/subscribe // events that match in the _customEvents table. for(prop in callback.customevents){ if(this._customEvents[prop][0]){ // Create the custom event o[this._customEvents[prop][0]] = new YAHOO.util.CustomEvent(this._customEvents[prop][1], (callback.scope)?callback.scope:null); // Subscribe the custom event o[this._customEvents[prop][0]].subscribe(callback.customevents[prop]); } } }, /** * @description This method serves as a timer that polls the XHR object's readyState * property during a transaction, instead of binding a callback to the * onreadystatechange event. Upon readyState 4, handleTransactionResponse * will process the response, and the timer will be cleared. * @method handleReadyState * @private * @static * @param {object} o The connection object * @param {callback} callback The user-defined callback object * @return {void} */ handleReadyState:function(o, callback) { var oConn = this; var args = (callback && callback.argument)?callback.argument:null; if(callback && callback.timeout){ this._timeOut[o.tId] = window.setTimeout(function(){ oConn.abort(o, callback, true); }, callback.timeout); } this._poll[o.tId] = window.setInterval( function(){ if(o.conn && o.conn.readyState === 4){ // Clear the polling interval for the transaction // and remove the reference from _poll. window.clearInterval(oConn._poll[o.tId]); delete oConn._poll[o.tId]; if(callback && callback.timeout){ window.clearTimeout(oConn._timeOut[o.tId]); delete oConn._timeOut[o.tId]; } // Fire global custom event -- completeEvent oConn.completeEvent.fire(o, args); if(o.completeEvent){ // Fire transaction custom event -- completeEvent o.completeEvent.fire(o, args); } oConn.handleTransactionResponse(o, callback); } } ,this._polling_interval); }, /** * @description This method attempts to interpret the server response and * determine whether the transaction was successful, or if an error or * exception was encountered. * @method handleTransactionResponse * @private * @static * @param {object} o The connection object * @param {object} callback The user-defined callback object * @param {boolean} isAbort Determines if the transaction was terminated via abort(). * @return {void} */ handleTransactionResponse:function(o, callback, isAbort) { var httpStatus, responseObject; var args = (callback && callback.argument)?callback.argument:null; try { if(o.conn.status !== undefined && o.conn.status !== 0){ httpStatus = o.conn.status; } else{ httpStatus = 13030; } } catch(e){ // 13030 is a custom code to indicate the condition -- in Mozilla/FF -- // when the XHR object's status and statusText properties are // unavailable, and a query attempt throws an exception. httpStatus = 13030; } if(httpStatus >= 200 && httpStatus < 300 || httpStatus === 1223){ responseObject = this.createResponseObject(o, args); if(callback && callback.success){ if(!callback.scope){ callback.success(responseObject); } else{ // If a scope property is defined, the callback will be fired from // the context of the object. callback.success.apply(callback.scope, [responseObject]); } } // Fire global custom event -- successEvent this.successEvent.fire(responseObject); if(o.successEvent){ // Fire transaction custom event -- successEvent o.successEvent.fire(responseObject); } } else{ switch(httpStatus){ // The following cases are wininet.dll error codes that may be encountered. case 12002: // Server timeout case 12029: // 12029 to 12031 correspond to dropped connections. case 12030: case 12031: case 12152: // Connection closed by server. case 13030: // See above comments for variable status. responseObject = this.createExceptionObject(o.tId, args, (isAbort?isAbort:false)); if(callback && callback.failure){ if(!callback.scope){ callback.failure(responseObject); } else{ callback.failure.apply(callback.scope, [responseObject]); } } break; default: responseObject = this.createResponseObject(o, args); if(callback && callback.failure){ if(!callback.scope){ callback.failure(responseObject); } else{ callback.failure.apply(callback.scope, [responseObject]); } } } // Fire global custom event -- failureEvent this.failureEvent.fire(responseObject); if(o.failureEvent){ // Fire transaction custom event -- failureEvent o.failureEvent.fire(responseObject); } } this.releaseObject(o); responseObject = null; }, /** * @description This method evaluates the server response, creates and returns the results via * its properties. Success and failure cases will differ in the response * object's property values. * @method createResponseObject * @private * @static * @param {object} o The connection object * @param {callbackArg} callbackArg The user-defined argument or arguments to be passed to the callback * @return {object} */ createResponseObject:function(o, callbackArg) { var obj = {}; var headerObj = {}; try { var headerStr = o.conn.getAllResponseHeaders(); var header = headerStr.split('\n'); for(var i=0; i<header.length; i++){ var delimitPos = header[i].indexOf(':'); if(delimitPos != -1){ headerObj[header[i].substring(0,delimitPos)] = header[i].substring(delimitPos+2); } } } catch(e){} obj.tId = o.tId; // Normalize IE's response to HTTP 204 when Win error 1223. obj.status = (o.conn.status == 1223)?204:o.conn.status; // Normalize IE's statusText to "No Content" instead of "Unknown". obj.statusText = (o.conn.status == 1223)?"No Content":o.conn.statusText; obj.getResponseHeader = headerObj; obj.getAllResponseHeaders = headerStr; obj.responseText = o.conn.responseText; obj.responseXML = o.conn.responseXML; if(callbackArg){ obj.argument = callbackArg; } return obj; }, /** * @description If a transaction cannot be completed due to dropped or closed connections, * there may be not be enough information to build a full response object. * The failure callback will be fired and this specific condition can be identified * by a status property value of 0. * * If an abort was successful, the status property will report a value of -1. * * @method createExceptionObject * @private * @static * @param {int} tId The Transaction Id * @param {callbackArg} callbackArg The user-defined argument or arguments to be passed to the callback * @param {boolean} isAbort Determines if the exception case is caused by a transaction abort * @return {object} */ createExceptionObject:function(tId, callbackArg, isAbort) { var COMM_CODE = 0; var COMM_ERROR = 'communication failure'; var ABORT_CODE = -1; var ABORT_ERROR = 'transaction aborted'; var obj = {}; obj.tId = tId; if(isAbort){ obj.status = ABORT_CODE; obj.statusText = ABORT_ERROR; } else{ obj.status = COMM_CODE; obj.statusText = COMM_ERROR; } if(callbackArg){ obj.argument = callbackArg; } return obj; }, /** * @description Method that initializes the custom HTTP headers for the each transaction. * @method initHeader * @public * @static * @param {string} label The HTTP header label * @param {string} value The HTTP header value * @param {string} isDefault Determines if the specific header is a default header * automatically sent with each transaction. * @return {void} */ initHeader:function(label, value, isDefault) { var headerObj = (isDefault)?this._default_headers:this._http_headers; headerObj[label] = value; if(isDefault){ this._has_default_headers = true; } else{ this._has_http_headers = true; } }, /** * @description Accessor that sets the HTTP headers for each transaction. * @method setHeader * @private * @static * @param {object} o The connection object for the transaction. * @return {void} */ setHeader:function(o) { var prop; if(this._has_default_headers){ for(prop in this._default_headers){ if(YAHOO.lang.hasOwnProperty(this._default_headers, prop)){ o.conn.setRequestHeader(prop, this._default_headers[prop]); } } } if(this._has_http_headers){ for(prop in this._http_headers){ if(YAHOO.lang.hasOwnProperty(this._http_headers, prop)){ o.conn.setRequestHeader(prop, this._http_headers[prop]); } } delete this._http_headers; this._http_headers = {}; this._has_http_headers = false; } }, /** * @description Resets the default HTTP headers object * @method resetDefaultHeaders * @public * @static * @return {void} */ resetDefaultHeaders:function(){ delete this._default_headers; this._default_headers = {}; this._has_default_headers = false; }, /** * @description This method assembles the form label and value pairs and * constructs an encoded string. * asyncRequest() will automatically initialize the transaction with a * a HTTP header Content-Type of application/x-www-form-urlencoded. * @method setForm * @public * @static * @param {string || object} form id or name attribute, or form object. * @param {boolean} optional enable file upload. * @param {boolean} optional enable file upload over SSL in IE only. * @return {string} string of the HTML form field name and value pairs.. */ setForm:function(formId, isUpload, secureUri) { var oForm, oElement, oName, oValue, oDisabled, hasSubmit = false, data = [], item = 0, i,len,j,jlen,opt; this.resetFormState(); if(typeof formId == 'string'){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -