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:
@@ -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"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user