⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datasource-debug.js

📁 这是YUI的源码及相关示例。里面有很多很炫的Javascript效果。
💻 JS
📖 第 1 页 / 共 5 页
字号:
 * * @method sendRequest * @param oRequest {Object} Request object. * @param oCallback {Object} An object literal with the following properties: *     <dl> *     <dt><code>success</code></dt> *     <dd>The function to call when the data is ready.</dd> *     <dt><code>failure</code></dt> *     <dd>The function to call upon a response failure condition.</dd> *     <dt><code>scope</code></dt> *     <dd>The object to serve as the scope for the success and failure handlers.</dd> *     <dt><code>argument</code></dt> *     <dd>Arbitrary data that will be passed back to the success and failure handlers.</dd> *     </dl>  * @param oCaller {Object} (deprecated) Use oCallback.scope. * @return {Number} Transaction ID, or null if response found in cache. */sendRequest : function(oRequest, oCallback, oCaller) {    // First look in cache    var oCachedResponse = this.getCachedResponse(oRequest, oCallback, oCaller);    if(oCachedResponse) {        DS.issueCallback(oCallback,[oRequest,oCachedResponse],false,oCaller);        return null;    }    // Not in cache, so forward request to live data    YAHOO.log("Making connection to live data for \"" + oRequest + "\"", "info", this.toString());    return this.makeConnection(oRequest, oCallback, oCaller);},/** * Overridable default method generates a unique transaction ID and passes  * the live data reference directly to the  handleResponse function. This * method should be implemented by subclasses to achieve more complex behavior * or to access remote data.           * * @method makeConnection * @param oRequest {Object} Request object. * @param oCallback {Object} Callback object literal. * @param oCaller {Object} (deprecated) Use oCallback.scope. * @return {Number} Transaction ID. */makeConnection : function(oRequest, oCallback, oCaller) {    var tId = DS._nTransactionId++;    this.fireEvent("requestEvent", {tId:tId, request:oRequest,callback:oCallback,caller:oCaller});    /* accounts for the following cases:    YAHOO.util.DataSourceBase.TYPE_UNKNOWN    YAHOO.util.DataSourceBase.TYPE_JSARRAY    YAHOO.util.DataSourceBase.TYPE_JSON    YAHOO.util.DataSourceBase.TYPE_HTMLTABLE    YAHOO.util.DataSourceBase.TYPE_XML    YAHOO.util.DataSourceBase.TYPE_TEXT    */    var oRawResponse = this.liveData;        this.handleResponse(oRequest, oRawResponse, oCallback, oCaller, tId);    return tId;},/** * Receives raw data response and type converts to XML, JSON, etc as necessary. * Forwards oFullResponse to appropriate parsing function to get turned into * oParsedResponse. Calls doBeforeCallback() and adds oParsedResponse to  * the cache when appropriate before calling issueCallback(). *  * The oParsedResponse object literal has the following properties: * <dl> *     <dd><dt>tId {Number}</dt> Unique transaction ID</dd> *     <dd><dt>results {Array}</dt> Array of parsed data results</dd> *     <dd><dt>meta {Object}</dt> Object literal of meta values</dd>  *     <dd><dt>error {Boolean}</dt> (optional) True if there was an error</dd> *     <dd><dt>cached {Boolean}</dt> (optional) True if response was cached</dd> * </dl> * * @method handleResponse * @param oRequest {Object} Request object * @param oRawResponse {Object} The raw response from the live database. * @param oCallback {Object} Callback object literal. * @param oCaller {Object} (deprecated) Use oCallback.scope. * @param tId {Number} Transaction ID. */handleResponse : function(oRequest, oRawResponse, oCallback, oCaller, tId) {    this.fireEvent("responseEvent", {tId:tId, request:oRequest, response:oRawResponse,            callback:oCallback, caller:oCaller});    YAHOO.log("Received live data response for \"" + oRequest + "\"", "info", this.toString());    var xhr = (this.dataType == DS.TYPE_XHR) ? true : false;    var oParsedResponse = null;    var oFullResponse = oRawResponse;        // Try to sniff data type if it has not been defined    if(this.responseType === DS.TYPE_UNKNOWN) {        var ctype = (oRawResponse && oRawResponse.getResponseHeader) ? oRawResponse.getResponseHeader["Content-Type"] : null;        if(ctype) {             // xml            if(ctype.indexOf("text/xml") > -1) {                this.responseType = DS.TYPE_XML;            }            else if(ctype.indexOf("application/json") > -1) { // json                this.responseType = DS.TYPE_JSON;            }            else if(ctype.indexOf("text/plain") > -1) { // text                this.responseType = DS.TYPE_TEXT;            }        }        else {            if(YAHOO.lang.isArray(oRawResponse)) { // array                this.responseType = DS.TYPE_JSARRAY;            }             // xml            else if(oRawResponse && oRawResponse.nodeType && oRawResponse.nodeType == 9) {                this.responseType = DS.TYPE_XML;            }            else if(oRawResponse && oRawResponse.nodeName && (oRawResponse.nodeName.toLowerCase() == "table")) { // table                this.responseType = DS.TYPE_HTMLTABLE;            }                else if(YAHOO.lang.isObject(oRawResponse)) { // json                this.responseType = DS.TYPE_JSON;            }            else if(YAHOO.lang.isString(oRawResponse)) { // text                this.responseType = DS.TYPE_TEXT;            }        }    }    switch(this.responseType) {        case DS.TYPE_JSARRAY:            if(xhr && oRawResponse && oRawResponse.responseText) {                oFullResponse = oRawResponse.responseText;             }            oFullResponse = this.doBeforeParseData(oRequest, oFullResponse, oCallback);            oParsedResponse = this.parseArrayData(oRequest, oFullResponse);            break;        case DS.TYPE_JSON:            if(xhr && oRawResponse && oRawResponse.responseText) {                oFullResponse = oRawResponse.responseText;            }            try {                // Convert to JSON object if it's a string                if(lang.isString(oFullResponse)) {                    // Check for YUI JSON Util                    if(lang.JSON) {                        oFullResponse = lang.JSON.parse(oFullResponse);                    }                    // Look for JSON parsers using an API similar to json2.js                    else if(window.JSON && JSON.parse) {                        oFullResponse = JSON.parse(oFullResponse);                    }                    // Look for JSON parsers using an API similar to json.js                    else if(oFullResponse.parseJSON) {                        oFullResponse = oFullResponse.parseJSON();                    }                    // No JSON lib found so parse the string                    else {                        // Trim leading spaces                        while (oFullResponse.length > 0 &&                                (oFullResponse.charAt(0) != "{") &&                                (oFullResponse.charAt(0) != "[")) {                            oFullResponse = oFullResponse.substring(1, oFullResponse.length);                        }                            if(oFullResponse.length > 0) {                            // Strip extraneous stuff at the end                            var objEnd = Math.max(oFullResponse.lastIndexOf("]"),oFullResponse.lastIndexOf("}"));                            oFullResponse = oFullResponse.substring(0,objEnd+1);                                // Turn the string into an object literal...                            // ...eval is necessary here                            oFullResponse = eval("(" + oFullResponse + ")");                            }                    }                }            }            catch(e) {            }            oFullResponse = this.doBeforeParseData(oRequest, oFullResponse, oCallback);            oParsedResponse = this.parseJSONData(oRequest, oFullResponse);            break;        case DS.TYPE_HTMLTABLE:            if(xhr && oRawResponse.responseText) {                oFullResponse = oRawResponse.responseText;            }            oFullResponse = this.doBeforeParseData(oRequest, oFullResponse, oCallback);            oParsedResponse = this.parseHTMLTableData(oRequest, oFullResponse);            break;        case DS.TYPE_XML:            if(xhr && oRawResponse.responseXML) {                oFullResponse = oRawResponse.responseXML;            }            oFullResponse = this.doBeforeParseData(oRequest, oFullResponse, oCallback);            oParsedResponse = this.parseXMLData(oRequest, oFullResponse);            break;        case DS.TYPE_TEXT:            if(xhr && lang.isString(oRawResponse.responseText)) {                oFullResponse = oRawResponse.responseText;            }            oFullResponse = this.doBeforeParseData(oRequest, oFullResponse, oCallback);            oParsedResponse = this.parseTextData(oRequest, oFullResponse);            break;        default:            oFullResponse = this.doBeforeParseData(oRequest, oFullResponse, oCallback);            oParsedResponse = this.parseData(oRequest, oFullResponse);            break;    }    // Clean up for consistent signature    oParsedResponse = oParsedResponse || {};    if(!oParsedResponse.results) {        oParsedResponse.results = [];    }    if(!oParsedResponse.meta) {        oParsedResponse.meta = {};    }    // Success    if(oParsedResponse && !oParsedResponse.error) {        // Last chance to touch the raw response or the parsed response        oParsedResponse = this.doBeforeCallback(oRequest, oFullResponse, oParsedResponse, oCallback);        this.fireEvent("responseParseEvent", {request:oRequest,                response:oParsedResponse, callback:oCallback, caller:oCaller});        // Cache the response        this.addToCache(oRequest, oParsedResponse);    }    // Error    else {        // Be sure the error flag is on        oParsedResponse.error = true;        this.fireEvent("dataErrorEvent", {request:oRequest, response: oRawResponse, callback:oCallback,                 caller:oCaller, message:DS.ERROR_DATANULL});        YAHOO.log(DS.ERROR_DATANULL, "error", this.toString());    }    // Send the response back to the caller    oParsedResponse.tId = tId;    DS.issueCallback(oCallback,[oRequest,oParsedResponse],oParsedResponse.error,oCaller);},/** * Overridable method gives implementers access to the original full response * before the data gets parsed. Implementers should take care not to return an * unparsable or otherwise invalid response. * * @method doBeforeParseData * @param oRequest {Object} Request object. * @param oFullResponse {Object} The full response from the live database. * @param oCallback {Object} The callback object.   * @return {Object} Full response for parsing.   */doBeforeParseData : function(oRequest, oFullResponse, oCallback) {    return oFullResponse;},/** * Overridable method gives implementers access to the original full response and * the parsed response (parsed against the given schema) before the data * is added to the cache (if applicable) and then sent back to callback function. * This is your chance to access the raw response and/or populate the parsed * response with any custom data. * * @method doBeforeCallback * @param oRequest {Object} Request object. * @param oFullResponse {Object} The full response from the live database. * @param oParsedResponse {Object} The parsed response to return to calling object. * @param oCallback {Object} The callback object.  * @return {Object} Parsed response object. */doBeforeCallback : function(oRequest, oFullResponse, oParsedResponse, oCallback) {    return oParsedResponse;},/** * Overridable method parses data of generic RESPONSE_TYPE into a response object. * * @method parseData * @param oRequest {Object} Request object. * @param oFullResponse {Object} The full Array from the live database. * @return {Object} Parsed response object with the following properties:<br> *     - results {Array} Array of parsed data results<br> *     - meta {Object} Object literal of meta values<br> *     - error {Boolean} (optional) True if there was an error<br> */parseData : function(oRequest, oFullResponse) {    if(lang.isValue(oFullResponse)) {        var oParsedResponse = {results:oFullResponse,meta:{}};        YAHOO.log("Parsed generic data is " +                lang.dump(oParsedResponse), "info", this.toString());        return oParsedResponse;    }    YAHOO.log("Generic data could not be parsed: " + lang.dump(oFullResponse),             "error", this.toString());    return null;},/** * Overridable method parses Array data into a response object. * * @method parseArrayData * @param oRequest {Object} Request object. * @param oFullResponse {Object} The full Array from the live database. * @return {Object} Parsed response object with the following properties:<br> *     - results (Array) Array of parsed data results<br> *     - error (Boolean) True if there was an error */parseArrayData : function(oRequest, oFullResponse) {    if(lang.isArray(oFullResponse)) {        var results = [],            i, j,            rec, field, data;                // Parse for fields        if(lang.isArray(this.responseSchema.fields)) {            var fields = this.responseSchema.fields;            for (i = fields.length - 1; i >= 0; --i) {                if (typeof fields[i] !== 'object') {                    fields[i] = { key : fields[i] };                }            }            var parsers = {}, p;            for (i = fields.length - 1; i >= 0; --i) {                p = (typeof fields[i].parser === 'function' ?                          fields[i].parser :                          DS.Parser[fields[i].parser+'']) || fields[i].converter;                if (p) {                    parsers[fields[i].key] = p;                }            }            var arrType = lang.isArray(oFullResponse[0]);            for(i=oFullResponse.length-1; i>-1; i--) {                var oResult = {};                rec = oFullResponse[i];                if (typeof rec === 'object') {                    for(j=fields.length-1; j>-1; j--) {                        field = fields[j];                        data = arrType ? rec[j] : rec[field.key];                        if (parsers[field.key]) {                            data = parsers[field.key].call(this,data);                        }                        // Safety measure                        if(data === undefined) {                            data = null;                        }                        oResult[field.key] = data;                    }                }                else if (lang.isString(rec)) {                    for(j=fields.length-1; j>-1; j--) {                        field = fields[j];                        data = rec;                        if (parsers[field.key]) {                            data = parsers[field.key].call(this,data);                        }                        // Safety measure                        if(data === undefined) {                            data = null;                        }                        oResult[field.key] = data;                    }                                }                results[i] = oResult;            }            }        // Return entire data set        else {            results = oFullResponse;        }        var oParsedResponse = {results:results};        YAHOO.log("Parsed array data is " +                lang.dump(oParsedResponse), "info", this.toString());        return oParsedResponse;    }    YAHOO.log("Array data could not be parsed: " + lang.dump(oFullResponse),             "error", this.toString());    return null;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -