📄 connection.js
字号:
} break; default: responseObject = this.createResponseObject(o, callback.argument); if(callback.failure){ if(!callback.scope){ callback.failure(responseObject); } else{ callback.failure.apply(callback.scope, [responseObject]); } } } } this.releaseObject(o); }, /** * 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. * @private * @param {object} o The connection object * @param {} callbackArg 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; obj.status = o.conn.status; obj.statusText = o.conn.statusText; obj.getResponseHeader = headerObj; obj.getAllResponseHeaders = headerStr; obj.responseText = o.conn.responseText; obj.responseXML = o.conn.responseXML; if(typeof callbackArg !== undefined){ obj.argument = callbackArg; } return obj; }, /** * 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. * * @private * @param {int} tId Transaction Id * @param callbackArg The user-defined arguments * @param isAbort Determines if the exception is an 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; }, /** * Public method that stores the custom HTTP headers for each transaction. * @public * @param {string} label The HTTP header label * @param {string} value The HTTP header value * @return void */ initHeader:function(label,value) { if(this._http_header[label] === undefined){ this._http_header[label] = value; } else{ this._http_header[label] = value + "," + this._http_header[label]; } this._has_http_headers = true; }, /** * Accessor that sets the HTTP headers for each transaction. * @private * @param {object} o The connection object for the transaction. * @return void */ setHeader:function(o) { for(var prop in this._http_header){ if(this._http_header.propertyIsEnumerable){ o.conn.setRequestHeader(prop, this._http_header[prop]); } } delete this._http_header; this._http_header = {}; this._has_http_headers = false; }, /** * This method assembles the form label and value pairs and * constructs an encoded string. * asyncRequest() will automatically initialize the * transaction with a HTTP header Content-Type of * application/x-www-form-urlencoded. * @public * @param {string || object} form id or name attribute, or form object. * @param {string} optional boolean to indicate SSL environment. * @param {string} optional qualified path of iframe resource for SSL in IE. * @return void */ setForm:function(formId, isUpload, secureUri) { this._sFormData = ''; if(typeof formId == 'string'){ // Determine if the argument is a form id or a form name. // Note form name usage is deprecated by supported // here for legacy reasons. var oForm = (document.getElementById(formId) || document.forms[formId]); } else if(typeof formId == 'object'){ var oForm = formId; } else{ return; } // If the isUpload argument is true, setForm will call createFrame to initialize // an iframe as the form target. // // The argument secureURI is also required by IE in SSL environments // where the secureURI string is a fully qualified HTTP path, used to set the source // of the iframe, to a stub resource in the same domain. if(isUpload){ (typeof secureUri == 'string')?this.createFrame(secureUri):this.createFrame(); this._isFormSubmit = true; this._isFileUpload = true; this._formNode = oForm; return; } var oElement, oName, oValue, oDisabled; var hasSubmit = false; // Iterate over the form elements collection to construct the // label-value pairs. for (var i=0; i<oForm.elements.length; i++){ oDisabled = oForm.elements[i].disabled; // If the name attribute is not populated, the form field's // value will not be submitted. oElement = oForm.elements[i]; oName = oForm.elements[i].name; oValue = oForm.elements[i].value; // Do not submit fields that are disabled or // do not have a name attribute value. if(!oDisabled && oName) { switch (oElement.type) { case 'select-one': case 'select-multiple': for(var j=0; j<oElement.options.length; j++){ if(oElement.options[j].selected){ this._sFormData += encodeURIComponent(oName) + '=' + encodeURIComponent(oElement.options[j].value || oElement.options[j].text) + '&'; } } break; case 'radio': case 'checkbox': if(oElement.checked){ this._sFormData += encodeURIComponent(oName) + '=' + encodeURIComponent(oValue) + '&'; } break; case 'file': // stub case as XMLHttpRequest will only send the file path as a string. case undefined: // stub case for fieldset element which returns undefined. case 'reset': // stub case for input type reset button. case 'button': // stub case for input type button elements. break; case 'submit': if(hasSubmit == false){ this._sFormData += encodeURIComponent(oName) + '=' + encodeURIComponent(oValue) + '&'; hasSubmit = true; } break; default: this._sFormData += encodeURIComponent(oName) + '=' + encodeURIComponent(oValue) + '&'; break; } } } this._isFormSubmit = true; this._sFormData = this._sFormData.substr(0, this._sFormData.length - 1); }, /** * Creates an iframe to be used for form file uploads. It is remove from the * document upon completion of the upload transaction. * * @private * @param {string} optional qualified path of iframe resource for SSL in IE. * @return void */ createFrame:function(secureUri){ // IE does not allow the setting of id and name attributes as DOM // properties. A different iframe creation pattern is required for IE. if(window.ActiveXObject){ var io = document.createElement('<IFRAME name="ioFrame" id="ioFrame">'); if(secureUri){ // IE will throw a security exception in an SSL environment if the // iframe source isn't set to a valid resource. io.src = secureUri; } } else{ var io = document.createElement('IFRAME'); io.id = 'ioFrame'; io.name = 'ioFrame'; } io.style.position = 'absolute'; io.style.top = '-1000px'; io.style.left = '-1000px'; document.body.appendChild(io); }, /** * Uploads HTML form, including files/attachments, targeting the * iframe created in createFrame. * * @private * @param {int} id The transaction id. * @param {object} callback - User-defined callback object. * @param {string} uri Fully qualified path of resource. * @return void */ uploadFile:function(id, callback, uri){ // Initialize the HTML form properties in case they are // not defined in the HTML form. this._formNode.action = uri; this._formNode.enctype = 'multipart/form-data'; this._formNode.method = 'POST'; this._formNode.target = 'ioFrame'; this._formNode.submit(); // Reset form status properties. this._formNode = null; this._isFileUpload = false; this._isFormSubmit = false; // Create the upload callback handler that fires when the iframe // receives the load event. Subsequently, the event handler is detached // and the iframe removed from the document. var uploadCallback = function() { var oResponse = { tId: id, responseText: document.getElementById("ioFrame").contentWindow.document.body.innerHTML, argument: callback.argument } if(callback.upload){ if(!callback.scope){ callback.upload(oResponse); } else{ callback.upload.apply(callback.scope, [oResponse]); } } YAHOO.util.Event.removeListener("ioFrame", "load", uploadCallback); window.ioFrame.location.replace('#'); setTimeout("document.body.removeChild(document.getElementById('ioFrame'))",100); }; // Bind the onload handler to the iframe to detect the file upload response. YAHOO.util.Event.addListener("ioFrame", "load", uploadCallback); }, /** * Public method to terminate a transaction, if it has not reached readyState 4. * @public * @param {object} o The connection object returned by asyncRequest. * @param {object} callback User-defined callback object. * @param {string} isTimeout boolean to indicate if abort was a timeout. * @return void */ abort:function(o, callback, isTimeout) { if(this.isCallInProgress(o)){ window.clearInterval(this._poll[o.tId]); this._poll.splice(o.tId); if(isTimeout){ this._timeOut.splice(o.tId); } o.conn.abort(); this.handleTransactionResponse(o, callback, true); return true; } else{ return false; } }, /** * Public method to check if the transaction is still being processed. * @public * @param {object} o The connection object returned by asyncRequest * @return boolean */ isCallInProgress:function(o) { // if the XHR object assigned to the transaction has not been dereferenced, // then check its readyState status. Otherwise, return false. if(o.conn){ return o.conn.readyState != 4 && o.conn.readyState != 0; } else{ //The XHR object has been destroyed. return false; } }, /** * Dereference the XHR instance and the connection object after the transaction is completed. * @private * @param {object} o The connection object * @return void */ releaseObject:function(o) { //dereference the XHR instance. o.conn = null; //dereference the connection object. o = null; }};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -