我过去执行此操作的方法是在单击之后、发出 AJAX 请求之前创建一个虚拟弹出窗口。然后,请求完成后,关闭占位符,绑定真正的弹出窗口并打开它。
我不知道它如何(或者即使)适用于您所描述的简单标记对象,因为我只尝试过将其与 L.geoJson 图层结合使用。该方法的方便之处在于,它允许您访问 onEachFeature,它允许您调用函数以根据 geoJSON 对象的属性动态设置样式。
但是,当然,如果您有许多标记需要访问许多不同的 URL,那么您可能无论如何都希望将它们放入 GeoJSON 数据库中。像这样的东西:
var markerdata = {
"type": "FeatureCollection",
"features": [{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [-84.537291, 33.767675, 0]
},
"properties": {
"geometry": "Point",
"name": "Test Marker 1",
"url": "http://www.someurl.com/file_1.html"
}
}, {
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [-84.556685, 33.748580, 0]
},
"properties": {
"geometry": "Point",
"name": "Test Marker 2",
"url": "http://www.someotherurl.com/file_2.html"
}
}]
};
要实际绑定弹出窗口,该函数将如下所示:
function onEachMarker(feature, layer) {
layer.on('click', function (e) {
//destroy any old popups that might be attached
if (layer._popup != undefined) {
layer.unbindPopup();
}
var marker_url = feature.properties.url;
//display a placeholder popup
var pop = L.popup().setLatLng(this._latlng).setContent('Loading...').openOn(map);
//request data and make a new popup when it's done
$.ajax({
url: marker_url,
success: function (data) {
//close placeholder popup
layer.closePopup();
//attach the real popup and open it
layer.bindPopup(data);
});
layer.openPopup();
}
});
});
}
然后您可以使用 onEachFeature 来调用每个功能的函数:
//display markers on map
datalayer = L.geoJson(markerdata, {
onEachFeature: onEachMarker
}).addTo(map);
您可以看到此方法正在运行(尽管略有不同)在这里摆弄 http://fiddle.jshell.net/nathansnider/w6ma3yzo/。每次单击标记时,都会向 tumblr API 发送 AJAX 请求,并根据 geoJSON 中包含的帖子 ID 提取缩略图的 URL。
如果您仍然无法让它工作,您应该通过 console.log 或您可以使用的任何调试方式检查您的 .get 或 .ajax 请求返回的内容(如果有的话)。服务器可能拒绝您的请求,或者 Leaflet 无法理解返回的数据。