📄 datasource.js
字号:
return oParsedResponse; } } return null; },/** * Overridable method parses XML data for one result into an object literal. * * @method parseXMLResult * @param result {XML} XML for one result. * @return {Object} Object literal of data for one result. */parseXMLResult : function(result) { var oResult = {}, schema = this.responseSchema; try { // Loop through each data field in each result using the schema for(var m = schema.fields.length-1; m >= 0 ; m--) { var field = schema.fields[m]; var key = (lang.isValue(field.key)) ? field.key : field; var data = null; // Values may be held in an attribute... var xmlAttr = result.attributes.getNamedItem(key); if(xmlAttr) { data = xmlAttr.value; } // ...or in a node else { var xmlNode = result.getElementsByTagName(key); if(xmlNode && xmlNode.item(0) && xmlNode.item(0)) { data = xmlNode.item(0).firstChild.nodeValue; var item = xmlNode.item(0); // For IE, then DOM... data = (item.text) ? item.text : (item.textContent) ? item.textContent : null; // ...then fallback, but check for multiple child nodes if(!data) { var datapieces = []; for(var j=0, len=item.childNodes.length; j<len; j++) { if(item.childNodes[j].nodeValue) { datapieces[datapieces.length] = item.childNodes[j].nodeValue; } } if(datapieces.length > 0) { data = datapieces.join(""); } } } } // Safety net if(data === null) { data = ""; } // Backward compatibility if(!field.parser && field.converter) { field.parser = field.converter; } var parser = (typeof field.parser === 'function') ? field.parser : DS.Parser[field.parser+'']; if(parser) { data = parser.call(this, data); } // Safety measure if(data === undefined) { data = null; } oResult[key] = data; } } catch(e) { } return oResult;},/** * Overridable method parses XML data into a response object. * * @method parseXMLData * @param oRequest {Object} Request object. * @param oFullResponse {Object} The full XML response 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 */parseXMLData : function(oRequest, oFullResponse) { var bError = false, schema = this.responseSchema, oParsedResponse = {meta:{}}, xmlList = null, metaNode = schema.metaNode, metaLocators = schema.metaFields || {}, i,k,loc,v; // In case oFullResponse is something funky try { xmlList = (schema.resultNode) ? oFullResponse.getElementsByTagName(schema.resultNode) : null; // Pull any meta identified metaNode = metaNode ? oFullResponse.getElementsByTagName(metaNode)[0] : oFullResponse; if (metaNode) { for (k in metaLocators) { if (lang.hasOwnProperty(metaLocators, k)) { loc = metaLocators[k]; // Look for a node v = metaNode.getElementsByTagName(loc)[0]; if (v) { v = v.firstChild.nodeValue; } else { // Look for an attribute v = metaNode.attributes.getNamedItem(loc); if (v) { v = v.value; } } if (lang.isValue(v)) { oParsedResponse.meta[k] = v; } } } } } catch(e) { } if(!xmlList || !lang.isArray(schema.fields)) { bError = true; } // Loop through each result else { oParsedResponse.results = []; for(i = xmlList.length-1; i >= 0 ; --i) { var oResult = this.parseXMLResult(xmlList.item(i)); // Capture each array of values into an array of results oParsedResponse.results[i] = oResult; } } if(bError) { oParsedResponse.error = true; } else { } return oParsedResponse;},/** * Overridable method parses JSON data into a response object. * * @method parseJSONData * @param oRequest {Object} Request object. * @param oFullResponse {Object} The full JSON 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 */parseJSONData : function(oRequest, oFullResponse) { var oParsedResponse = {results:[],meta:{}}; if(lang.isObject(oFullResponse) && this.responseSchema.resultsList) { var schema = this.responseSchema, fields = schema.fields, resultsList = oFullResponse, results = [], metaFields = schema.metaFields || {}, fieldParsers = [], fieldPaths = [], simpleFields = [], bError = false, i,len,j,v,key,parser,path; // Function to convert the schema's fields into walk paths var buildPath = function (needle) { var path = null, keys = [], i = 0; if (needle) { // Strip the ["string keys"] and [1] array indexes needle = needle. replace(/\[(['"])(.*?)\1\]/g, function (x,$1,$2) {keys[i]=$2;return '.@'+(i++);}). replace(/\[(\d+)\]/g, function (x,$1) {keys[i]=parseInt($1,10)|0;return '.@'+(i++);}). replace(/^\./,''); // remove leading dot // If the cleaned needle contains invalid characters, the // path is invalid if (!/[^\w\.\$@]/.test(needle)) { path = needle.split('.'); for (i=path.length-1; i >= 0; --i) { if (path[i].charAt(0) === '@') { path[i] = keys[parseInt(path[i].substr(1),10)]; } } } else { } } return path; }; // Function to walk a path and return the pot of gold var walkPath = function (path, origin) { var v=origin,i=0,len=path.length; for (;i<len && v;++i) { v = v[path[i]]; } return v; }; // Parse the response // Step 1. Pull the resultsList from oFullResponse (default assumes // oFullResponse IS the resultsList) path = buildPath(schema.resultsList); if (path) { resultsList = walkPath(path, oFullResponse); if (resultsList === undefined) { bError = true; } } else { bError = true; } if (!resultsList) { resultsList = []; } if (!lang.isArray(resultsList)) { resultsList = [resultsList]; } if (!bError) { // Step 2. Parse out field data if identified if(schema.fields) { var field; // Build the field parser map and location paths for (i=0, len=fields.length; i<len; i++) { field = fields[i]; key = field.key || field; parser = ((typeof field.parser === 'function') ? field.parser : DS.Parser[field.parser+'']) || field.converter; path = buildPath(key); if (parser) { fieldParsers[fieldParsers.length] = {key:key,parser:parser}; } if (path) { if (path.length > 1) { fieldPaths[fieldPaths.length] = {key:key,path:path}; } else { simpleFields[simpleFields.length] = {key:key,path:path[0]}; } } else { } } // Process the results, flattening the records and/or applying parsers if needed //if (fieldParsers.length || fieldPaths.length) { for (i = resultsList.length - 1; i >= 0; --i) { var r = resultsList[i], rec = {}; for (j = simpleFields.length - 1; j >= 0; --j) { // Bug 1777850: data might be held in an array rec[simpleFields[j].key] = (r[simpleFields[j].path] !== undefined) ? r[simpleFields[j].path] : r[j]; } for (j = fieldPaths.length - 1; j >= 0; --j) { rec[fieldPaths[j].key] = walkPath(fieldPaths[j].path,r); } for (j = fieldParsers.length - 1; j >= 0; --j) { var p = fieldParsers[j].key; rec[p] = fieldParsers[j].parser(rec[p]); if (rec[p] === undefined) { rec[p] = null; } } results[i] = rec; } //} } else { results = resultsList; } for (key in metaFields) { if (lang.hasOwnProperty(metaFields,key)) { path = buildPath(metaFields[key]); if (path) { v = walkPath(path, oFullResponse); oParsedResponse.meta[key] = v; } } } } else { oParsedResponse.error = true; } oParsedResponse.results = results; } else { oParsedResponse.error = true; } return oParsedResponse;},/** * Overridable method parses an HTML TABLE element reference into a response object. * Data is parsed out of TR elements from all TBODY elements. * * @method parseHTMLTableData * @param oRequest {Object} Request object. * @param oFullResponse {Object} The full HTML element reference 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 */parseHTMLTableData : function(oRequest, oFullResponse) { var bError = false; var elTable = oFullResponse; var fields = this.responseSchema.fields; var oParsedResponse = {results:[]}; // Iterate through each TBODY for(var i=0; i<elTable.tBodies.length; i++) { var elTbody = elTable.tBodies[i]; // Iterate through each TR for(var j=elTbody.rows.length-1; j>-1; j--) { var elRow = elTbody.rows[j]; var oResult = {}; for(var k=fields.length-1; k>-1; k--) { var field = fields[k]; var key = (lang.isValue(field.key)) ? field.key : field; var data = elRow.cells[k].innerHTML; // Backward compatibility if(!field.parser && field.converter) { field.parser = field.converter; } var parser = (typeof field.parser === 'function') ? field.parser : DS.Parser[field.parser+'']; if(parser) { data = parser.call(this, data); } // Safety measure if(data === undefined) { data = null; } oResult[key] = data; } oParsedResponse.results[j] = oResult; } } if(bError) { oParsedResponse.error = true; } else { } return oParsedResponse;}};// DataSourceBase uses EventProviderlang.augmentProto(DS, util.EventProvider);/****************************************************************************//****************************************************************************//****************************************************************************//** * LocalDataSource class for in-memory data structs including JavaScript arrays, * JavaScript object literals (JSON), XML documents, and HTML tables. * * @namespace YAHOO.util * @class YAHOO.util.LocalDataSource * @extends YAHOO.util.DataSourceBase * @constructor * @param oLiveData {HTMLElement} Pointer to live data. * @param oConfigs {object} (optional) Object literal of configuration values. */util.LocalDataSource = function(oLiveData, oConfigs) { this.dataType = DS.TYPE_LOCAL; if(oLiveData) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -