Use document fragments to write multiple nodes

For writer functions that need to generate multiple nodes, the
createDocumentFragment method can be used.
This commit is contained in:
tschaub
2012-10-25 11:56:48 -06:00
parent 7f2ce74dd7
commit e6399a265d
3 changed files with 57 additions and 30 deletions
+8 -30
View File
@@ -281,19 +281,6 @@ OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
return this.writers.ogc["Filter"].apply(this, [filter]); return this.writers.ogc["Filter"].apply(this, [filter]);
}, },
/**
* Method: writeFeatureIdNodes
*
* Parameters:
* filter - {<OpenLayers.Filter.FeatureId}
* node - {DOMElement}
*/
writeFeatureIdNodes: function(filter, node) {
for (var i=0, ii=filter.fids.length; i<ii; ++i) {
this.writeNode("FeatureId", filter.fids[i], node);
}
},
/** /**
* Property: writers * Property: writers
* As a compliment to the readers property, this structure contains public * As a compliment to the readers property, this structure contains public
@@ -304,10 +291,13 @@ OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
"ogc": { "ogc": {
"Filter": function(filter) { "Filter": function(filter) {
var node = this.createElementNSPlus("ogc:Filter"); var node = this.createElementNSPlus("ogc:Filter");
if (filter.type === "FID") { this.writeNode(this.getFilterType(filter), filter, node);
OpenLayers.Format.Filter.v1.prototype.writeFeatureIdNodes.call(this, filter, node); return node;
} else { },
this.writeNode(this.getFilterType(filter), filter, node); "_featureIds": function(filter) {
var node = this.createDocumentFragment();
for (var i=0, ii=filter.fids.length; i<ii; ++i) {
this.writeNode("ogc:FeatureId", filter.fids[i], node);
} }
return node; return node;
}, },
@@ -321,14 +311,10 @@ OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
var childFilter; var childFilter;
for (var i=0, ii=filter.filters.length; i<ii; ++i) { for (var i=0, ii=filter.filters.length; i<ii; ++i) {
childFilter = filter.filters[i]; childFilter = filter.filters[i];
if (childFilter.type === "FID") {
OpenLayers.Format.Filter.v1.prototype.writeFeatureIdNodes.call(this, childFilter, node);
} else {
this.writeNode( this.writeNode(
this.getFilterType(childFilter), childFilter, node this.getFilterType(childFilter), childFilter, node
); );
} }
}
return node; return node;
}, },
"Or": function(filter) { "Or": function(filter) {
@@ -336,26 +322,18 @@ OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
var childFilter; var childFilter;
for (var i=0, ii=filter.filters.length; i<ii; ++i) { for (var i=0, ii=filter.filters.length; i<ii; ++i) {
childFilter = filter.filters[i]; childFilter = filter.filters[i];
if (childFilter.type === "FID") {
OpenLayers.Format.Filter.v1.prototype.writeFeatureIdNodes.call(this, childFilter, node);
} else {
this.writeNode( this.writeNode(
this.getFilterType(childFilter), childFilter, node this.getFilterType(childFilter), childFilter, node
); );
} }
}
return node; return node;
}, },
"Not": function(filter) { "Not": function(filter) {
var node = this.createElementNSPlus("ogc:Not"); var node = this.createElementNSPlus("ogc:Not");
var childFilter = filter.filters[0]; var childFilter = filter.filters[0];
if (childFilter.type === "FID") {
OpenLayers.Format.Filter.v1.prototype.writeFeatureIdNodes.call(this, childFilter, node);
} else {
this.writeNode( this.writeNode(
this.getFilterType(childFilter), childFilter, node this.getFilterType(childFilter), childFilter, node
); );
}
return node; return node;
}, },
"PropertyIsLessThan": function(filter) { "PropertyIsLessThan": function(filter) {
@@ -498,7 +476,7 @@ OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
"WITHIN": "WITHIN", "WITHIN": "WITHIN",
"CONTAINS": "CONTAINS", "CONTAINS": "CONTAINS",
"INTERSECTS": "INTERSECTS", "INTERSECTS": "INTERSECTS",
"FID": "FeatureId" "FID": "_featureIds"
}, },
CLASS_NAME: "OpenLayers.Format.Filter.v1" CLASS_NAME: "OpenLayers.Format.Filter.v1"
+20
View File
@@ -230,6 +230,26 @@ OpenLayers.Format.XML = OpenLayers.Class(OpenLayers.Format, {
return element; return element;
}, },
/**
* APIMethod: createDocumentFragment
* Create a document fragment node that can be appended to another node
* created by createElementNS. This will call
* document.createDocumentFragment outside of IE. In IE, the ActiveX
* object's createDocumentFragment method is used.
*
* Returns:
* {Element} A document fragment.
*/
createDocumentFragment: function() {
var element;
if (this.xmldom) {
element = this.xmldom.createDocumentFragment();
} else {
element = document.createDocumentFragment();
}
return element;
},
/** /**
* APIMethod: createTextNode * APIMethod: createTextNode
* Create a text node. This node can be appended to another node with * Create a text node. This node can be appended to another node with
+29
View File
@@ -166,6 +166,35 @@
"node can be appended to a doc root"); "node can be appended to a doc root");
} }
function test_createDocumentFragment(t) {
t.plan(3);
var format = new OpenLayers.Format.XML();
var uri = "http://foo.com";
var prefix = "foo";
var localName = "bar";
var qualifiedName = prefix + ":" + localName;
var parent = format.createElementNS(uri, qualifiedName);
var fragment = format.createDocumentFragment();
t.eq(fragment.nodeType, 11, "fragment type");
try {
fragment.appendChild(format.createTextNode("one"));
fragment.appendChild(format.createTextNode("two"));
t.eq(fragment.childNodes.length, 2, "fragment has two child nodes");
} catch (err) {
t.fail("trouble appending text nodes to fragment: " + err.message);
}
try {
parent.appendChild(fragment);
t.eq(parent.childNodes.length, 2, "parent has two child nodes");
} catch (err) {
t.fail("trouble appending fragment to parent: " + err.message);
}
}
function test_Format_XML_createTextNode(t) { function test_Format_XML_createTextNode(t) {
t.plan(10); t.plan(10);