L.TileLayer.Canvas = L.TileLayer.extend({ options: { async: false }, initialize: function(options) { L.Util.setOptions(this, options); }, _createTileProto: function() { this._canvasProto = L.DomUtil.create('canvas', 'leaflet-tile'); var tileSize = this.options.tileSize; this._canvasProto.width = tileSize; this._canvasProto.height = tileSize; }, _createTile: function() { var tile = this._canvasProto.cloneNode(false); tile.onselectstart = tile.onmousemove = L.Util.falseFn; return tile; }, _loadTile: function(tile, tilePoint, zoom) { tile._layer = this; this.drawTile(tile, tilePoint, zoom); if (!this.options.async) { this.tileDrawn(tile); } }, drawTile: function(tile, tilePoint, zoom) { // override with rendering code }, tileDrawn: function(tile) { this._tileOnLoad.call(tile); } });