?? connection-debug.js
字號:
var o = (this._isFileUpload)?this.getConnectionObject(true):this.getConnectionObject(); if(!o){ YAHOO.log('Unable to create connection object.', 'error', 'Connection'); 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{ uri += "?" + 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; } } o.conn.open(method, uri, true); //this.processTransactionHeaders(o); // 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); YAHOO.log('Initialize transaction header X-Request-Header to XMLHttpRequest.', 'info', 'Connection'); } } if(this._isFormSubmit || (postData && this._use_default_post_header)){ this.initHeader('Content-Type', this._default_post_header); YAHOO.log('Initialize header Content-Type to application/x-www-form-urlencoded for POST transaction.', 'info', 'Connection'); if(this._isFormSubmit){ this.resetFormState(); } } if(this._has_default_headers || this._has_http_headers){ this.setHeader(o); } this.handleReadyState(o, callback); o.conn.send(postData || null); // Fire global custom event -- startEvent this.startEvent.fire(o); if(o.startEvent){ // Fire transaction custom event -- startEvent o.startEvent.fire(o); } 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) { // Enumerate through callback.customevents members and bind/subscribe // events that match in the _customEvents table. for(var 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); YAHOO.log('Transaction-specific Custom Event ' + o[this._customEvents[prop][1]] + ' created.', 'info', 'Connection'); // Subscribe the custom event o[this._customEvents[prop][0]].subscribe(callback.customevents[prop]); YAHOO.log('Transaction-specific Custom Event ' + o[this._customEvents[prop][1]] + ' subscribed.', 'info', 'Connection'); } } }, /** * @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; 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); if(o.completeEvent){ // Fire transaction custom event -- completeEvent o.completeEvent.fire(o); } 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) { // If no valid callback is provided, then do not process any callback handling. if(!callback){ this.releaseObject(o); YAHOO.log('No callback object to process. Transaction complete.', 'info', 'Connection'); return; } var httpStatus, responseObject; try { if(o.conn.status !== undefined && o.conn.status !== 0){ httpStatus = o.conn.status; } else{ httpStatus = 13030; } } catch(e){ // 13030 is the custom code to indicate the condition -- in Mozilla/FF -- // when the o 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, callback.argument); if(callback.success){ if(!callback.scope){ callback.success(responseObject); YAHOO.log('Success callback. HTTP code is ' + httpStatus, 'info', 'Connection'); } else{ // If a scope property is defined, the callback will be fired from // the context of the object. callback.success.apply(callback.scope, [responseObject]); YAHOO.log('Success callback with scope. HTTP code is ' + httpStatus, 'info', 'Connection'); } } // 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, callback.argument, (isAbort?isAbort:false)); if(callback.failure){ if(!callback.scope){ callback.failure(responseObject); YAHOO.log('Failure callback. Exception detected. Status code is ' + httpStatus, 'warn', 'Connection'); } else{ callback.failure.apply(callback.scope, [responseObject]); YAHOO.log('Failure callback with scope. Exception detected. Status code is ' + httpStatus, 'warn', 'Connection'); } } break; default: responseObject = this.createResponseObject(o, callback.argument); if(callback.failure){ if(!callback.scope){ callback.failure(responseObject); YAHOO.log('Failure callback. HTTP status code is ' + httpStatus, 'warn', 'Connection'); } else{ callback.failure.apply(callback.scope, [responseObject]); YAHOO.log('Failure callback with scope. HTTP status code is ' + httpStatus, 'warn', 'Connection'); } } } // 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(typeof callbackArg !== undefined){ 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; if(headerObj[label] === undefined){ headerObj[label] = value; } else{ // Concatenate multiple values, comma-delimited, // for the same header label, headerObj[label] = value + "," + headerObj[label]; } 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) { if(this._has_default_headers){ for(var prop in this._default_headers){ if(YAHOO.lang.hasOwnProperty(this._default_headers, prop)){ o.conn.setRequestHeader(prop, this._default_headers[prop]); YAHOO.log('Default HTTP header ' + prop + ' set with value of ' + this._default_headers[prop], 'info', 'Connection'); } } } if(this._has_http_headers){ for(var prop in this._http_headers){ if(YAHOO.lang.hasOwnProperty(this._http_headers, prop)){ o.conn.setRequestHeader(prop, this._http_headers[prop]); YAHOO.log('HTTP header ' + prop + ' set with value of ' + this._http_headers[prop], 'info', 'Connection'); } } 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) { this.resetFormState(); var oForm; 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. oForm = (document.getElementById(formId) || document.forms[formId]); } else if(typeof formId == 'object'){ // Treat argument as an HTML form object. oForm = formId; } else{ YAHOO.log('Unable to create form object ' + formId, 'warn', 'Connection');
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -