188 lines
5.9 KiB
JavaScript
188 lines
5.9 KiB
JavaScript
|
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
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|