Due to circular references, the layer switcher could prevent layers from
being cleared in Internet Explorer. This patch fixes #577. Patch from Erik. git-svn-id: http://svn.openlayers.org/trunk/openlayers@2918 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
@@ -25,7 +25,7 @@ OpenLayers.Control.LayerSwitcher.prototype =
|
|||||||
baseLayersDiv: null,
|
baseLayersDiv: null,
|
||||||
|
|
||||||
/** @type Array */
|
/** @type Array */
|
||||||
baseLayerInputs: null,
|
baseLayers: null,
|
||||||
|
|
||||||
|
|
||||||
/** @type DOMElement */
|
/** @type DOMElement */
|
||||||
@@ -35,7 +35,7 @@ OpenLayers.Control.LayerSwitcher.prototype =
|
|||||||
dataLayersDiv: null,
|
dataLayersDiv: null,
|
||||||
|
|
||||||
/** @type Array */
|
/** @type Array */
|
||||||
dataLayerInputs: null,
|
dataLayers: null,
|
||||||
|
|
||||||
|
|
||||||
/** @type DOMElement */
|
/** @type DOMElement */
|
||||||
@@ -85,6 +85,27 @@ OpenLayers.Control.LayerSwitcher.prototype =
|
|||||||
return this.div;
|
return this.div;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/** user specifies either "base" or "data". we then clear all the
|
||||||
|
* corresponding listeners, the div, and reinitialize a new array.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*
|
||||||
|
* @param {String} layersType Ei
|
||||||
|
*/
|
||||||
|
clearLayersArray: function(layersType) {
|
||||||
|
var layers = this[layersType + "Layers"];
|
||||||
|
if (layers) {
|
||||||
|
for(var i=0; i < layers.length; i++) {
|
||||||
|
var layer = layers[i];
|
||||||
|
OpenLayers.Event.stopObservingElement(layer.inputElem);
|
||||||
|
OpenLayers.Event.stopObservingElement(layer.labelSpan);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this[layersType + "LayersDiv"].innerHTML = "";
|
||||||
|
this[layersType + "Layers"] = new Array();
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
/** Goes through and takes the current state of the Map and rebuilds the
|
/** Goes through and takes the current state of the Map and rebuilds the
|
||||||
* control to display that state. Groups base layers into a radio-button
|
* control to display that state. Groups base layers into a radio-button
|
||||||
* group and lists each data layer with a checkbox.
|
* group and lists each data layer with a checkbox.
|
||||||
@@ -95,11 +116,8 @@ OpenLayers.Control.LayerSwitcher.prototype =
|
|||||||
redraw: function() {
|
redraw: function() {
|
||||||
|
|
||||||
//clear out previous layers
|
//clear out previous layers
|
||||||
this.baseLayersDiv.innerHTML = "";
|
this.clearLayersArray("base");
|
||||||
this.baseLayerInputs = new Array();
|
this.clearLayersArray("data");
|
||||||
|
|
||||||
this.dataLayersDiv.innerHTML = "";
|
|
||||||
this.dataLayerInputs = new Array();
|
|
||||||
|
|
||||||
var containsOverlays = false;
|
var containsOverlays = false;
|
||||||
|
|
||||||
@@ -128,14 +146,17 @@ OpenLayers.Control.LayerSwitcher.prototype =
|
|||||||
inputElem.value = layer.name;
|
inputElem.value = layer.name;
|
||||||
inputElem.checked = checked;
|
inputElem.checked = checked;
|
||||||
inputElem.defaultChecked = checked;
|
inputElem.defaultChecked = checked;
|
||||||
inputElem.layer = layer;
|
|
||||||
inputElem.control = this;
|
|
||||||
|
|
||||||
if (!baseLayer && !layer.inRange) {
|
if (!baseLayer && !layer.inRange) {
|
||||||
inputElem.disabled = true;
|
inputElem.disabled = true;
|
||||||
}
|
}
|
||||||
|
var context = {
|
||||||
|
'inputElem': inputElem,
|
||||||
|
'layer': layer,
|
||||||
|
'layerSwitcher': this
|
||||||
|
}
|
||||||
OpenLayers.Event.observe(inputElem, "mouseup",
|
OpenLayers.Event.observe(inputElem, "mouseup",
|
||||||
this.onInputClick.bindAsEventListener(inputElem));
|
this.onInputClick.bindAsEventListener(context));
|
||||||
|
|
||||||
// create span
|
// create span
|
||||||
var labelSpan = document.createElement("span");
|
var labelSpan = document.createElement("span");
|
||||||
@@ -143,16 +164,21 @@ OpenLayers.Control.LayerSwitcher.prototype =
|
|||||||
labelSpan.style.color = "gray";
|
labelSpan.style.color = "gray";
|
||||||
}
|
}
|
||||||
labelSpan.innerHTML = layer.name;
|
labelSpan.innerHTML = layer.name;
|
||||||
labelSpan.style.verticalAlign = (baseLayer) ? "bottom" : "baseline";
|
labelSpan.style.verticalAlign = (baseLayer) ? "bottom"
|
||||||
|
: "baseline";
|
||||||
OpenLayers.Event.observe(labelSpan, "click",
|
OpenLayers.Event.observe(labelSpan, "click",
|
||||||
this.onInputClick.bindAsEventListener(inputElem));
|
this.onInputClick.bindAsEventListener(context));
|
||||||
// create line break
|
// create line break
|
||||||
var br = document.createElement("br");
|
var br = document.createElement("br");
|
||||||
|
|
||||||
|
|
||||||
var groupArray = (baseLayer) ? this.baseLayerInputs
|
var groupArray = (baseLayer) ? this.baseLayers
|
||||||
: this.dataLayerInputs;
|
: this.dataLayers;
|
||||||
groupArray.push(inputElem);
|
groupArray.push({
|
||||||
|
'layer': layer,
|
||||||
|
'inputElem': inputElem,
|
||||||
|
'labelSpan': labelSpan
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
var groupDiv = (baseLayer) ? this.baseLayersDiv
|
var groupDiv = (baseLayer) ? this.baseLayersDiv
|
||||||
@@ -173,18 +199,24 @@ OpenLayers.Control.LayerSwitcher.prototype =
|
|||||||
*
|
*
|
||||||
* @private
|
* @private
|
||||||
*
|
*
|
||||||
|
* @context
|
||||||
|
* {DOMElement} inputElem
|
||||||
|
* {OpenLayers.Control.LayerSwitcher} layerSwitcher
|
||||||
|
* {OpenLayers.Layer} layer
|
||||||
|
*
|
||||||
* @param {Event} e
|
* @param {Event} e
|
||||||
*/
|
*/
|
||||||
|
|
||||||
onInputClick: function(e) {
|
onInputClick: function(e) {
|
||||||
if (!this.disabled) {
|
|
||||||
if (this.type == "radio") {
|
if (!this.inputElem.disabled) {
|
||||||
this.checked = true;
|
if (this.inputElem.type == "radio") {
|
||||||
|
this.inputElem.checked = true;
|
||||||
this.layer.map.setBaseLayer(this.layer, true);
|
this.layer.map.setBaseLayer(this.layer, true);
|
||||||
this.layer.map.events.triggerEvent("changebaselayer");
|
this.layer.map.events.triggerEvent("changebaselayer");
|
||||||
} else {
|
} else {
|
||||||
this.checked = !this.checked;
|
this.inputElem.checked = !this.inputElem.checked;
|
||||||
this.control.updateMap();
|
this.layerSwitcher.updateMap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
OpenLayers.Event.stop(e);
|
OpenLayers.Event.stop(e);
|
||||||
@@ -211,17 +243,17 @@ OpenLayers.Control.LayerSwitcher.prototype =
|
|||||||
updateMap: function() {
|
updateMap: function() {
|
||||||
|
|
||||||
// set the newly selected base layer
|
// set the newly selected base layer
|
||||||
for(var i=0; i < this.baseLayerInputs.length; i++) {
|
for(var i=0; i < this.baseLayers.length; i++) {
|
||||||
var input = this.baseLayerInputs[i];
|
var layerEntry = this.baseLayers[i];
|
||||||
if (input.checked) {
|
if (layerEntry.inputElem.checked) {
|
||||||
this.map.setBaseLayer(input.layer, false);
|
this.map.setBaseLayer(layerEntry.layer, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// set the correct visibilities for the overlays
|
// set the correct visibilities for the overlays
|
||||||
for(var i=0; i < this.dataLayerInputs.length; i++) {
|
for(var i=0; i < this.dataLayers.length; i++) {
|
||||||
var input = this.dataLayerInputs[i];
|
var layerEntry = this.dataLayers[i];
|
||||||
input.layer.setVisibility(input.checked, true);
|
layerEntry.layer.setVisibility(layerEntry.inputElem.checked, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user