📄 xmlsa.as
字号:
/*---------------------------------------------------------------------------XMLSA for Flash MX v1.4----------------------------------------------------------------------------- Created by Max Ziebell (ziebell@worldoptimizer.com) Version History: 06/2003 - Added Mixed-Node notation Added optional sessionID and onStartSession, onEndSession-Events Added load, send and sendAndLoad Added noCache with autodetection if online or local changed dump to return the output so you can trace or assign it Added dumpHtml Added search 04/2003 - Added insertBefore and removeNode removed support for Flash 5! sorry but this was causing problems! 03/2003 - Added the known methodes of XML to work with XMLSA Now you can use: appendChild, cloneNode Added removeChildByIndex 01/2003 - Added support for direct access of attributes 12/2002 - Added support for Flash 5 but in this case I recommend to use XMLNitro with it. 11/2002 - First release---------------------------------------------------------------------------*/// Constructor_global.XMLSA=function ( watchXML ){ this.$xml = this.$root = this.$parent = new Object(); ASSetPropFlags(this,null,1,1); if (watchXML != undefined) {this._parse.apply (this,arguments)};}// loadXMLSA.prototype.load= function(){ var loader = this._makeLoader(this); arguments[0] = this._makeURL(arguments[0]); loader.load.apply(loader,arguments);}// sendXMLSA.prototype.send= function(){ arguments[0] = this._makeURL(arguments[0]); if(arguments.length==2) { this.$root.send.apply(this.$root, arguments); } else { this.$root.sendAndLoad.apply(this.$root, arguments[0], new XML()); }}// toStringXMLSA.prototype.toString= function(){ return this.$xml.toString();}// sendAndLoadXMLSA.prototype.sendAndLoad= function(host, target, method){ var loader = this._makeLoader(target); this.$root.sendAndLoad(this._makeURL(host),loader,method);}// searchXMLSA.prototype.search = function(criteria, recursive){ XMLNode.prototype.$criteria = criteria; arguments.shift(); var result = this._search.apply(this,arguments); delete (XMLNode.prototype.$criteria); return result;}//return a reference to XMLXMLSA.prototype.getXML= function(){ return this.$xml;}// return the value of the firstChild if its a textElementXMLSA.prototype.getValue= function(){ return (this.$xml.firstChild.nodeType == 3 ? this.$xml.firstChild.nodeValue : undefined);}// set a textNodeXMLSA.prototype.setValue= function( text ){ // check if the node has a textElement? if (this.$xml.firstChild.nodeType == undefined) { // seems like we have to create one... this.$xml.appendChild(new XML().createTextNode(text)); return true; // else check if firstChild is a textElement and set it... }else if (this.$xml.firstChild.nodeType == 3) { this.$xml.firstChild.nodeValue = text; return true; // retrun success on setValue // seams like it ain't possible } else { return false; // retrun failed on setValue }}//return the nodeNameXMLSA.prototype.getNodeName= function(){ return this.$xml.nodeName;}// append a childXMLSA.prototype.appendChild= function(element){ if (element instanceof XML) { element = element.firstChild; } this.$xml.appendChild (element);//XML this._reParse ();//XMLSA}// return a XML object with cloneNodeXMLSA.prototype.cloneNode= function(rekursiv){ return this.$xml.cloneNode (rekursiv);//XML}// this one I added as it's sometimes simpler just want// to add a new member...XMLSA.prototype.appendElement= function(name,value,attribs){ var temp = new XML(); this.$xml.appendChild(temp.createElement(name)); if (value != null) { this.$xml.lastChild.appendChild (temp.createTextNode(value)); } if (typeof(attribs) == "object" ) { // there is a bug in Flash MX so we got to do this... // a direct assignment would add __proto__ and constructor // to the attributes... for (var key in attribs ) { this.$xml.lastChild.attributes[key] = attribs[key]; } } this._reParse ();//XMLSA}// remove child by indexXMLSA.prototype.removeChildByIndex= function(name,idx){ this[name][idx].$xml.removeNode(); this[name].splice(idx,1);}// remove child by indexXMLSA.prototype.removeNode= function(){ this.$xml.removeNode(); this.$parent._reParse();}// insert beforeXMLSA.prototype.insertBefore= function(node){ this.$parent.$xml.insertBefore (node,this.$xml); this.$parent._reParse();}/*************************************************/// Private/*************************************************/// Parser// called by the constructor and by reParseXMLSA.prototype._parse= function(node, parent){ this.$parent = parent; // make shure we work with XMLNode if (node instanceof XML) { this.$version = "XMLSA 1.4"; this.$root = node; node = node.firstChild; } else { this.$root = this.$parent.$root; } // store a reference to $xml this.$xml=node; this.attributes = node.attributes; if (node.nodeType == 1 and node.firstChild.nodeType <> 3) { for (var childCounter=0; childCounter< node.childNodes.length; childCounter++) { var tempName = node.childNodes[ childCounter ].nodeName; if (this[ tempName ]==undefined) { this[ tempName ] = new Array(); this[ tempName ].__resolve = XMLSA.prototype.mixed__resolve; ASSetPropFlags(this[ tempName ],null,1,1); } this[ tempName ].push ( new XMLSA(node.childNodes[ childCounter ], this) ); } }}// reParse// free a brach and reparse itXMLSA.prototype._reParse= function(){ this._cleanup(); // parse it again... this._parse (this.$xml,this.$parent);}XMLSA.prototype._cleanup= function(){ // delete all for (var found in this){ delete (this[found]); }}// make pathXMLSA.prototype._makeURL= function( host ){ if (this._online()) { var nocache = (random(100000)+100000); if (_global.sessionID!=undefined) { return host+"?sid="+_global.sessionID+"&nocache="+nocache; } else { return host+"?nocache="+nocache; } } else { return host; }}XMLSA.prototype._online = function() { // are we online? return (_root._url.subStr(0,7) == "http://");}// used by send, load and sendAndLoadXMLSA.prototype._makeLoader= function(target){ var loader = new XML(); loader.ignoreWhite = true; loader.link = target; loader.onLoad = function(ok) { if (ok) { ASSetPropFlags(this.link,["onLoad"],1,1); this.link._cleanup(); ASSetPropFlags(this.link,["onLoad"],0,1); this.link._parse(this); this.link.onLoad(true); // Experimental Session Support //--------------------------------------------------- // use the attribute 'session' in the root tag to // submit a sessionID if you transmit the word // 'timeout' or 'end' the session gets deleted var header = this.link.attributes; if (header.session != undefined) { switch (header.session) { case "timeout": case "end": if (_global.session!=undefined) { delete(_global.session); _global.onSessionEnd(header); } break; default: _global.session = new Object(); _global.session.id=header.session; _global.onSessionStart(header); break; } } } else { this.link.onLoad(false); } } return loader;}XMLSA.prototype._search = function(recursive){ var result = new Array(); for (var found in this) { for (var node in this[found]) { if (this[found][node].$xml != undefined) { if (this[found][node].$xml.$criteria()) { result.push(this[found][node]); } if (recursive) { result = result.concat(this[found][node]._search.apply(this[found][node], arguments)); } } } } return result;}// new since 1.4 allows notations without a nodenumber because// it defaults them to 0 in that case! (redirection)XMLSA.prototype.mixed__resolve = function(found){ return this[0][found];}/*************************************************/// Debugger/*************************************************/// you can delete this function or use it!// it provides a nice way to trace XMLSA-StructureXMLSA.prototype.dump = function ( obj, sName, nLevels) { var out=""; // init if (typeof(obj)!="object") { obj = this; sName = this.getNodeName(); } var idx, sPre = ''; if (nLevels == null) { nLevels = 0; } for (idx=1; idx<=nLevels; idx++) { sPre += '\t'; } // open branch out += sPre + sName + '{\n'; nLevels++; // turn them the right way var childs = new Array(); for (idx in obj) { childs.push(idx) } childs.reverse(); // loop through them for (idx=0;idx<childs.length;++idx) { if (typeof(obj[childs[idx]]) == 'object' and childs[idx] ne "$xml") { out += this.dump( obj[childs[idx]], childs[idx], nLevels ); } else { out += sPre + '\t' + childs[idx] + '="' + obj[childs[idx]].toString() + '"\n'; } } // close branch out += sPre + '}\n'; return out;}XMLSA.prototype.dumpHTML = function ( obj, sName, nLevels) { var out=""; // init if (typeof(obj)!="object") { obj = this; sName = this.getNodeName(); } var idx, sPre = ''; if (nLevels == null) { nLevels = 0; } for (idx=1; idx<=nLevels; idx++) { sPre += ' '; } // open branch out += sPre + sName + '{<br/>'; nLevels++; // turn them the right way var childs = new Array(); for (idx in obj) { childs.push(idx) } childs.reverse(); // loop through them for (idx=0;idx<childs.length;++idx) { if (typeof(obj[childs[idx]]) == 'object') { out += this.dump( obj[childs[idx]], childs[idx], nLevels ); } else { out += sPre + ' ' + childs[idx] + '="' + obj[childs[idx]].toString() + '"<br/>'; } } // close branch out += sPre + '}<br/>'; return out;}// hidde all functions to for..in loopsASSetPropFlags(XMLSA.prototype,null,1,1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -