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