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

View File

@@ -281,19 +281,6 @@ OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
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
* 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": {
"Filter": function(filter) {
var node = this.createElementNSPlus("ogc:Filter");
if (filter.type === "FID") {
OpenLayers.Format.Filter.v1.prototype.writeFeatureIdNodes.call(this, filter, node);
} else {
this.writeNode(this.getFilterType(filter), filter, node);
this.writeNode(this.getFilterType(filter), filter, node);
return 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;
},
@@ -321,14 +311,10 @@ OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
var childFilter;
for (var i=0, ii=filter.filters.length; i<ii; ++i) {
childFilter = filter.filters[i];
if (childFilter.type === "FID") {
OpenLayers.Format.Filter.v1.prototype.writeFeatureIdNodes.call(this, childFilter, node);
} else {
this.writeNode(
this.getFilterType(childFilter), childFilter, node
);
}
}
return node;
},
"Or": function(filter) {
@@ -336,26 +322,18 @@ OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
var childFilter;
for (var i=0, ii=filter.filters.length; i<ii; ++i) {
childFilter = filter.filters[i];
if (childFilter.type === "FID") {
OpenLayers.Format.Filter.v1.prototype.writeFeatureIdNodes.call(this, childFilter, node);
} else {
this.writeNode(
this.getFilterType(childFilter), childFilter, node
);
}
}
return node;
},
"Not": function(filter) {
var node = this.createElementNSPlus("ogc:Not");
var childFilter = filter.filters[0];
if (childFilter.type === "FID") {
OpenLayers.Format.Filter.v1.prototype.writeFeatureIdNodes.call(this, childFilter, node);
} else {
this.writeNode(
this.getFilterType(childFilter), childFilter, node
);
}
return node;
},
"PropertyIsLessThan": function(filter) {
@@ -498,7 +476,7 @@ OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
"WITHIN": "WITHIN",
"CONTAINS": "CONTAINS",
"INTERSECTS": "INTERSECTS",
"FID": "FeatureId"
"FID": "_featureIds"
},
CLASS_NAME: "OpenLayers.Format.Filter.v1"

View File

@@ -230,6 +230,26 @@ OpenLayers.Format.XML = OpenLayers.Class(OpenLayers.Format, {
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
* Create a text node. This node can be appended to another node with