Backbuffer and transitionend only when there are tiles

When an application zooms the map programmatically right after
initialization, there will be an empty backbuffer. This should be avoided,
because it adds an unnecessary DOM element.

The tile.onLoadEnd handler registers a transitionend listener on the image
of the last loaded tile. But if loading was aborted, there will be no
image. The new logic registers the transitionend event on the last child
of the layer div, which is not necessarily the tile we're handling loadend
for. When the backbuffer is empty (i.e. no tile was loaded at the time the
backbuffer was created), it will be removed immediately.
This commit is contained in:
ahocevar
2013-03-26 11:53:27 +01:00
parent 63ea10a916
commit 7f18a7b3df
2 changed files with 21 additions and 12 deletions

View File

@@ -1110,18 +1110,25 @@ OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {
}
//if that was the last tile, then trigger a 'loadend' on the layer
if (this.numLoadingTiles === 0) {
if(this.backBuffer) {
this._transitionElement = tile.imgDiv;
for (var i=this.transitionendEvents.length-1; i>=0; --i) {
OpenLayers.Event.observe(this._transitionElement,
this.transitionendEvents[i],
this._removeBackBuffer);
if (this.backBuffer) {
if (this.backBuffer.childNodes.length === 0) {
// no tiles transitioning, remove immediately
this.removeBackBuffer();
} else {
// wait until transition has ended or delay has passed
this._transitionElement = this.div.lastChild;
var transitionendEvents = this.transitionendEvents;
for (var i=transitionendEvents.length-1; i>=0; --i) {
OpenLayers.Event.observe(this._transitionElement,
transitionendEvents[i],
this._removeBackBuffer);
}
// the removal of the back buffer is delayed to prevent
// flash effects due to the animation of tile displaying
this.backBufferTimerId = window.setTimeout(
this._removeBackBuffer, this.removeBackBufferDelay
);
}
// the removal of the back buffer is delayed to prevent
// flash effects due to the animation of tile displaying
this.backBufferTimerId = window.setTimeout(
this._removeBackBuffer, this.removeBackBufferDelay
);
}
this.loading = false;
this.events.triggerEvent("loadend");