传单 - 瓷砖加载事件

WeS*_*eSt 5 javascript leaflet mapbox

我目前正在开发一个基于地图的应用程序,需要一种方法在Leaflet从 中提取图块时收到通知TileProvider(在我的例子中是MapBox)。我阅读了Leaflet 文档,特别是TileLayer的部分。目前,我正在使用以下代码来附加tileload处理程序:

map.eachLayer(function (layer) {
    layer.on('tileload', function(e) {
        console.log(e);
    });
});
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来获取TileLayer当前地图的?这种方法的一个问题是我将处理程序挂钩到所有层(虽然只会TileLayers引发事件,但将其挂钩到所有层是不干净的)。或者我可以以某种方式将处理程序直接附加到地图实例吗?

更新

我使用以下MapBox代码片段初始化地图:

map = L.mapbox.map( element, '...', mapOptions );
Run Code Online (Sandbox Code Playgroud)

这会自动创建一个TileLayer(以及其他几个层),将它们附加到该map对象并返回该对象以供以后使用。

Ale*_*fan 7

为什么不直接在tile层上使用tileload事件,如下所示:

//create a variable to store the tilelayer
var osm = L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png').addTo(map);

//add the tileload event directly to that variable
osm.on('tileload', function (e) {
    console.log(e);
});
Run Code Online (Sandbox Code Playgroud)


iH8*_*iH8 3

如果您有很多L.mapbox.TileLayer实例,并且不想像 Alexandru Pufan 在他的回答中建议的那样手动将事件处理程序添加到每个实例,您仍然可以使用循环和Object方法instanceof

map.eachLayer(function (layer) {
    if (layer instanceof L.mapbox.TileLayer) {
        layer.on('tileload', function(e) {
            console.log(e);
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

阅读完您对 Alexandru 答案的评论后,我猜您只有一层,那么最好将其手动添加到实例中,这可以通过L.mapbox.TileLayer以下方式实现:

var layer = L.mapbox.tileLayer(YOUR MAP ID);
layer.on('tileload', function(e) {
    console.log(e);
});

var map = L.mapbox.map('mapbox', null, {
    'center': [0, 0],
    'zoom': 0,
    'layers': [layer]
});
Run Code Online (Sandbox Code Playgroud)