📄 sarissa.js
字号:
}//if(window.XMLDocument) else if(document.implementation && document.implementation.hasFeature && document.implementation.hasFeature('LS', '3.0')){ Document.prototype.async = true; Document.prototype.onreadystatechange = null; Document.prototype.parseError = 0; Document.prototype.load = function(sURI) { var parser = document.implementation.createLSParser(this.async ? document.implementation.MODE_ASYNCHRONOUS : document.implementation.MODE_SYNCHRONOUS, null); if(this.async){ var self = this; parser.addEventListener("load", function(e) { self.readyState = 4; Sarissa.copyChildNodes(e.newDocument, self.documentElement, false); self.onreadystatechange.call(); }, false); }; try { var oDoc = parser.parseURI(sURI); } catch(e){ this.parseError = -1; }; if(!this.async) Sarissa.copyChildNodes(oDoc, this.documentElement, false); return oDoc; }; /** * <p>Factory method to obtain a new DOM Document object</p> * @argument sUri the namespace of the root node (if any) * @argument sUri the local name of the root node (if any) * @returns a new DOM Document */ Sarissa.getDomDocument = function(sUri, sName){ return document.implementation.createDocument(sUri?sUri:"", sName?sName:"", null); }; }; };//if(_SARISSA_HAS_DOM_CREATE_DOCUMENT)};//==========================================// Common stuff//==========================================if(!window.DOMParser){ /* * DOMParser is a utility class, used to construct DOMDocuments from XML strings * @constructor */ DOMParser = function() { }; if(_SARISSA_IS_SAFARI){ /** * Construct a new DOM Document from the given XMLstring * @param sXml the given XML string * @param contentType the content type of the document the given string represents (one of text/xml, application/xml, application/xhtml+xml). * @return a new DOM Document from the given XML string */ DOMParser.prototype.parseFromString = function(sXml, contentType){ if(contentType.toLowerCase() != "application/xml"){ throw "Cannot handle content type: \"" + contentType + "\""; }; var xmlhttp = new XMLHttpRequest(); xmlhttp.open("GET", "data:text/xml;charset=utf-8," + encodeURIComponent(str), false); xmlhttp.send(null); return xmlhttp.responseXML; }; }else if(Sarissa.getDomDocument && Sarissa.getDomDocument() && "loadXML" in Sarissa.getDomDocument()){ DOMParser.prototype.parseFromString = function(sXml, contentType){ var doc = Sarissa.getDomDocument(); doc.loadXML(sXml); return doc; }; };};if(window.XMLHttpRequest){ Sarissa.IS_ENABLED_XMLHTTP = true;}else if(_SARISSA_IS_IE){ /** * Emulate XMLHttpRequest * @constructor */ XMLHttpRequest = function() { return new ActiveXObject(_SARISSA_XMLHTTP_PROGID); }; Sarissa.IS_ENABLED_XMLHTTP = true;};if(!window.document.importNode && _SARISSA_IS_IE){ try{ /** * Implements importNode for the current window document in IE using innerHTML. * Testing showed that DOM was multiple times slower than innerHTML for this, * sorry folks. If you encounter trouble (who knows what IE does behind innerHTML) * please gimme a call. * @param oNode the Node to import * @param bChildren whether to include the children of oNode * @returns the imported node for further use */ window.document.importNode = function(oNode, bChildren){ var importNode = document.createElement("div"); if(bChildren) importNode.innerHTML = Sarissa.serialize(oNode); else importNode.innerHTML = Sarissa.serialize(oNode.cloneNode(false)); return importNode.firstChild; }; }catch(e){};};if(!Sarissa.getParseErrorText){ /** * <p>Returns a human readable description of the parsing error. Usefull * for debugging. Tip: append the returned error string in a <pre> * element if you want to render it.</p> * <p>Many thanks to Christian Stocker for the initial patch.</p> * @argument oDoc The target DOM document * @returns The parsing error description of the target Document in * human readable form (preformated text) */ Sarissa.getParseErrorText = function (oDoc){ var parseErrorText = Sarissa.PARSED_OK; if(oDoc && oDoc.parseError && oDoc.parseError != 0){ /*moz*/ if(oDoc.documentElement.tagName == "parsererror"){ parseErrorText = oDoc.documentElement.firstChild.data; parseErrorText += "\n" + oDoc.documentElement.firstChild.nextSibling.firstChild.data; }/*konq*/ else{ parseErrorText = Sarissa.getText(oDoc.documentElement);/*.getElementsByTagName("h1")[0], false) + "\n"; parseErrorText += Sarissa.getText(oDoc.documentElement.getElementsByTagName("body")[0], false) + "\n"; parseErrorText += Sarissa.getText(oDoc.documentElement.getElementsByTagName("pre")[0], false);*/ }; }; return parseErrorText; };};Sarissa.getText = function(oNode, deep){ var s = ""; var nodes = oNode.childNodes; for(var i=0; i < nodes.length; i++){ var node = nodes[i]; var nodeType = node.nodeType; if(nodeType == Node.TEXT_NODE || nodeType == Node.CDATA_SECTION_NODE){ s += node.data; }else if(deep == true && (nodeType == Node.ELEMENT_NODE || nodeType == Node.DOCUMENT_NODE || nodeType == Node.DOCUMENT_FRAGMENT_NODE)){ s += Sarissa.getText(node, true); }; }; return s;};if(window.XMLSerializer){ /** * <p>Factory method to obtain the serialization of a DOM Node</p> * @returns the serialized Node as an XML string */ Sarissa.serialize = function(oDoc){ var s = null; if(oDoc){ s = oDoc.innerHTML?oDoc.innerHTML:(new XMLSerializer()).serializeToString(oDoc); }; return s; };}else{ if(Sarissa.getDomDocument && (Sarissa.getDomDocument("","foo", null)).xml){ // see non-IE version Sarissa.serialize = function(oDoc) { var s = null; if(oDoc){ s = oDoc.innerHTML?oDoc.innerHTML:oDoc.xml; }; return s; }; /** * Utility class to serialize DOM Node objects to XML strings * @constructor */ XMLSerializer = function(){}; /** * Serialize the given DOM Node to an XML string * @param oNode the DOM Node to serialize */ XMLSerializer.prototype.serializeToString = function(oNode) { return oNode.xml; }; };};/** * strips tags from a markup string */Sarissa.stripTags = function (s) { return s.replace(/<[^>]+>/g,"");};/** * <p>Deletes all child nodes of the given node</p> * @argument oNode the Node to empty */Sarissa.clearChildNodes = function(oNode) { // need to check for firstChild due to opera 8 bug with hasChildNodes while(oNode.firstChild){ oNode.removeChild(oNode.firstChild); };};/** * <p> Copies the childNodes of nodeFrom to nodeTo</p> * <p> <b>Note:</b> The second object's original content is deleted before * the copy operation, unless you supply a true third parameter</p> * @argument nodeFrom the Node to copy the childNodes from * @argument nodeTo the Node to copy the childNodes to * @argument bPreserveExisting whether to preserve the original content of nodeTo, default is false */Sarissa.copyChildNodes = function(nodeFrom, nodeTo, bPreserveExisting) { if((!nodeFrom) || (!nodeTo)){ throw "Both source and destination nodes must be provided"; }; if(!bPreserveExisting){ Sarissa.clearChildNodes(nodeTo); }; var ownerDoc = nodeTo.nodeType == Node.DOCUMENT_NODE ? nodeTo : nodeTo.ownerDocument; var nodes = nodeFrom.childNodes; if(ownerDoc.importNode && (!_SARISSA_IS_IE)) { for(var i=0;i < nodes.length;i++) { nodeTo.appendChild(ownerDoc.importNode(nodes[i], true)); }; } else{ for(var i=0;i < nodes.length;i++) { nodeTo.appendChild(nodes[i].cloneNode(true)); }; };};/** * <p> Moves the childNodes of nodeFrom to nodeTo</p> * <p> <b>Note:</b> The second object's original content is deleted before * the move operation, unless you supply a true third parameter</p> * @argument nodeFrom the Node to copy the childNodes from * @argument nodeTo the Node to copy the childNodes to * @argument bPreserveExisting whether to preserve the original content of nodeTo, default is */ Sarissa.moveChildNodes = function(nodeFrom, nodeTo, bPreserveExisting) { if((!nodeFrom) || (!nodeTo)){ throw "Both source and destination nodes must be provided"; }; if(!bPreserveExisting){ Sarissa.clearChildNodes(nodeTo); }; var nodes = nodeFrom.childNodes; // if within the same doc, just move, else copy and delete if(nodeFrom.ownerDocument == nodeTo.ownerDocument){ while(nodeFrom.firstChild){ nodeTo.appendChild(nodeFrom.firstChild); }; }else{ var ownerDoc = nodeTo.nodeType == Node.DOCUMENT_NODE ? nodeTo : nodeTo.ownerDocument; if(ownerDoc.importNode && (!_SARISSA_IS_IE)) { for(var i=0;i < nodes.length;i++) { nodeTo.appendChild(ownerDoc.importNode(nodes[i], true)); }; }else{ for(var i=0;i < nodes.length;i++) { nodeTo.appendChild(nodes[i].cloneNode(true)); }; }; Sarissa.clearChildNodes(nodeFrom); };};/** * <p>Serialize any object to an XML string. All properties are serialized using the property name * as the XML element name. Array elements are rendered as <code>array-item</code> elements, * using their index/key as the value of the <code>key</code> attribute.</p> * @argument anyObject the object to serialize * @argument objectName a name for that object * @return the XML serializationj of the given object as a string */Sarissa.xmlize = function(anyObject, objectName, indentSpace){ indentSpace = indentSpace?indentSpace:''; var s = indentSpace + '<' + objectName + '>'; var isLeaf = false; if(!(anyObject instanceof Object) || anyObject instanceof Number || anyObject instanceof String || anyObject instanceof Boolean || anyObject instanceof Date){ s += Sarissa.escape(""+anyObject); isLeaf = true; }else{ s += "\n"; var itemKey = ''; var isArrayItem = anyObject instanceof Array; for(var name in anyObject){ s += Sarissa.xmlize(anyObject[name], (isArrayItem?"array-item key=\""+name+"\"":name), indentSpace + " "); }; s += indentSpace; }; return s += (objectName.indexOf(' ')!=-1?"</array-item>\n":"</" + objectName + ">\n");};/** * Escape the given string chacters that correspond to the five predefined XML entities * @param sXml the string to escape */Sarissa.escape = function(sXml){ return sXml.replace(/&/g, "&") .replace(/</g, "<") .replace(/>/g, ">") .replace(/"/g, """) .replace(/'/g, "'");};/** * Unescape the given string. This turns the occurences of the predefined XML * entities to become the characters they represent correspond to the five predefined XML entities * @param sXml the string to unescape */Sarissa.unescape = function(sXml){ return sXml.replace(/'/g,"'") .replace(/"/g,"\"") .replace(/>/g,">") .replace(/</g,"<") .replace(/&/g,"&");};//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -