New file |
0,0 → 1,187 |
if(!dojo._hasResource["dojox.data.dom"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. |
dojo._hasResource["dojox.data.dom"] = true; |
dojo.provide("dojox.data.dom"); |
|
//DOM type to int value for reference. |
//Ints make for more compact code than full constant names. |
//ELEMENT_NODE = 1; |
//ATTRIBUTE_NODE = 2; |
//TEXT_NODE = 3; |
//CDATA_SECTION_NODE = 4; |
//ENTITY_REFERENCE_NODE = 5; |
//ENTITY_NODE = 6; |
//PROCESSING_INSTRUCTION_NODE = 7; |
//COMMENT_NODE = 8; |
//DOCUMENT_NODE = 9; |
//DOCUMENT_TYPE_NODE = 10; |
//DOCUMENT_FRAGMENT_NODE = 11; |
//NOTATION_NODE = 12; |
|
//FIXME: Remove this file when possible. |
//This file contains internal/helper APIs as holders until the true DOM apis of Dojo 0.9 are finalized. |
//Therefore, these should not be generally used, they are present only for the use by XmlStore and the |
//wires project until proper dojo replacements are available. When such exist, XmlStore and the like |
//will be ported off these and this file will be deleted. |
dojo.experimental("dojox.data.dom"); |
|
dojox.data.dom.createDocument = function(/*string?*/ str, /*string?*/ mimetype){ |
// summary: |
// cross-browser implementation of creating an XML document object. |
// |
// str: |
// Optional text to create the document from. If not provided, an empty XML document will be created. |
// mimetype: |
// Optional mimetype of the text. Typically, this is text/xml. Will be defaulted to text/xml if not provided. |
var _document = dojo.doc; |
|
if(!mimetype){ mimetype = "text/xml"; } |
if(str && (typeof dojo.global["DOMParser"]) !== "undefined"){ |
var parser = new DOMParser(); |
return parser.parseFromString(str, mimetype); // DOMDocument |
}else if((typeof dojo.global["ActiveXObject"]) !== "undefined"){ |
var prefixes = [ "MSXML2", "Microsoft", "MSXML", "MSXML3" ]; |
for(var i = 0; i<prefixes.length; i++){ |
try{ |
var doc = new ActiveXObject(prefixes[i]+".XMLDOM"); |
if(str){ |
if(doc){ |
doc.async = false; |
doc.loadXML(str); |
return doc; // DOMDocument |
}else{ |
console.log("loadXML didn't work?"); |
} |
}else{ |
if(doc){ |
return doc; //DOMDocument |
} |
} |
}catch(e){ /* squelch */ }; |
} |
}else if((_document.implementation)&& |
(_document.implementation.createDocument)){ |
if(str){ |
if(_document.createElement){ |
// FIXME: this may change all tags to uppercase! |
var tmp = _document.createElement("xml"); |
tmp.innerHTML = str; |
var xmlDoc = _document.implementation.createDocument("foo", "", null); |
for(var i = 0; i < tmp.childNodes.length; i++) { |
xmlDoc.importNode(tmp.childNodes.item(i), true); |
} |
return xmlDoc; // DOMDocument |
} |
}else{ |
return _document.implementation.createDocument("", "", null); // DOMDocument |
} |
} |
return null; // DOMDocument |
} |
|
dojox.data.dom.textContent = function(/*Node*/node, /*string?*/text){ |
// summary: |
// Implementation of the DOM Level 3 attribute; scan node for text |
// description: |
// Implementation of the DOM Level 3 attribute; scan node for text |
// This function can also update the text of a node by replacing all child |
// content of the node. |
// node: |
// The node to get the text off of or set the text on. |
// text: |
// Optional argument of the text to apply to the node. |
if(arguments.length>1){ |
var _document = node.ownerDocument || dojo.doc; //Preference is to get the node owning doc first or it may fail |
dojox.data.dom.replaceChildren(node, _document.createTextNode(text)); |
return text; // string |
} else { |
if(node.textContent !== undefined){ //FF 1.5 |
return node.textContent; // string |
} |
var _result = ""; |
if(node == null){ |
return _result; //empty string. |
} |
for(var i = 0; i < node.childNodes.length; i++){ |
switch(node.childNodes[i].nodeType){ |
case 1: // ELEMENT_NODE |
case 5: // ENTITY_REFERENCE_NODE |
_result += dojox.data.dom.textContent(node.childNodes[i]); |
break; |
case 3: // TEXT_NODE |
case 2: // ATTRIBUTE_NODE |
case 4: // CDATA_SECTION_NODE |
_result += node.childNodes[i].nodeValue; |
break; |
default: |
break; |
} |
} |
return _result; // string |
} |
} |
|
dojox.data.dom.replaceChildren = function(/*Element*/node, /*Node || array*/ newChildren){ |
// summary: |
// Removes all children of node and appends newChild. All the existing |
// children will be destroyed. |
// description: |
// Removes all children of node and appends newChild. All the existing |
// children will be destroyed. |
// node: |
// The node to modify the children on |
// newChildren: |
// The children to add to the node. It can either be a single Node or an |
// array of Nodes. |
var nodes = []; |
|
if(dojo.isIE){ |
for(var i=0;i<node.childNodes.length;i++){ |
nodes.push(node.childNodes[i]); |
} |
} |
|
dojox.data.dom.removeChildren(node); |
for(var i=0;i<nodes.length;i++){ |
dojo._destroyElement(nodes[i]); |
} |
|
if(!dojo.isArray(newChildren)){ |
node.appendChild(newChildren); |
}else{ |
for(var i=0;i<newChildren.length;i++){ |
node.appendChild(newChildren[i]); |
} |
} |
} |
|
dojox.data.dom.removeChildren = function(/*Element*/node){ |
// summary: |
// removes all children from node and returns the count of children removed. |
// The children nodes are not destroyed. Be sure to call dojo._destroyElement on them |
// after they are not used anymore. |
// node: |
// The node to remove all the children from. |
var count = node.childNodes.length; |
while(node.hasChildNodes()){ |
node.removeChild(node.firstChild); |
} |
return count; // int |
} |
|
|
dojox.data.dom.innerXML = function(/*Node*/node){ |
// summary: |
// Implementation of MS's innerXML function. |
// node: |
// The node from which to generate the XML text representation. |
if(node.innerXML){ |
return node.innerXML; // string |
}else if (node.xml){ |
return node.xml; // string |
}else if(typeof XMLSerializer != "undefined"){ |
return (new XMLSerializer()).serializeToString(node); // string |
} |
} |
|
|
} |