使用延迟加载图像的 Leaflet bindpopup()
Leaflet bindpop() using lazyload of images
我正在使用传单在地图上放置一些标记。我已经设置好,点击一个标记,将打开一个显示图像的弹出窗口。这是一个简单的例子:
var map = L.map('map')
.addLayer(tile)
.setView([initLat, initLon], initZoom);
var m = L.marker([lat, lon])
.bindPopup('<img src="1.jpg"/>')
.addTo(map);
我的 objective 是使用延迟加载加载那些图像(上例中的“1.jpg”),所以只有在我点击标记时才会加载。
有人知道怎么做吗?
谢谢!
您可以设置弹窗打开时的弹窗内容。
让我们创建一个带有 lazyload
选项但没有内容的自定义弹出窗口:
var m = L.marker([0, 0])
.bindPopup(L.popup({
lazyload: '<img src="1.jpg"/>'
}))
.addTo(map);
然后您可以设置全局处理程序以在需要时填充您的弹出窗口:
map.on('popupopen', function(e) {
var popen = e.popup;
if (popen.options.lazyload) {
popen.setContent(popen.options.lazyload);
}
});
还有一个演示:
var map = L.map('map', {
center: [0, 0],
zoom: 1
});
var m = L.marker([-30, 0])
.bindPopup(L.popup({
lazyload: '<img src="https://i.stack.imgur.com/shfxy.jpg?s=32&g=1" />'
}))
.addTo(map);
map.on('popupopen', function(e) {
var popen = e.popup;
if (popen.options.lazyload) {
popen.setContent(popen.options.lazyload);
}
});
html, body {
height: 100%;
margin: 0;
}
#map {
width: 100%;
height: 150px;
}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.3.1/leaflet.css"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.3.1/leaflet.js"></script>
<div id='map'></div>
实际上,在您用字符串内容填充弹出窗口的情况下(就像您对 .bindPopup('<img src="1.jpg"/>')
所做的那样),Leaflet 仅当弹出窗口首先在地图上打开。因此您的图像只会在那一刻加载,这正是您正在寻找的延迟加载行为。
所以你不需要在你的问题代码中做任何额外的事情:
(确保刷新页面/清除缓存以查看浏览器网络请求中的图像加载传递)
var map = L.map('map', {
center: [0, 0],
zoom: 1
});
var m = L.marker([-30, 0])
.bindPopup('<img src="https://i.stack.imgur.com/shfxy.jpg?s=32&g=1" />')
.addTo(map);
html, body {
height: 100%;
margin: 0;
}
#map {
width: 100%;
height: 150px;
}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.3.1/leaflet.css"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.3.1/leaflet.js"></script>
<div id='map'></div>
我正在使用传单在地图上放置一些标记。我已经设置好,点击一个标记,将打开一个显示图像的弹出窗口。这是一个简单的例子:
var map = L.map('map')
.addLayer(tile)
.setView([initLat, initLon], initZoom);
var m = L.marker([lat, lon])
.bindPopup('<img src="1.jpg"/>')
.addTo(map);
我的 objective 是使用延迟加载加载那些图像(上例中的“1.jpg”),所以只有在我点击标记时才会加载。
有人知道怎么做吗?
谢谢!
您可以设置弹窗打开时的弹窗内容。
让我们创建一个带有 lazyload
选项但没有内容的自定义弹出窗口:
var m = L.marker([0, 0])
.bindPopup(L.popup({
lazyload: '<img src="1.jpg"/>'
}))
.addTo(map);
然后您可以设置全局处理程序以在需要时填充您的弹出窗口:
map.on('popupopen', function(e) {
var popen = e.popup;
if (popen.options.lazyload) {
popen.setContent(popen.options.lazyload);
}
});
还有一个演示:
var map = L.map('map', {
center: [0, 0],
zoom: 1
});
var m = L.marker([-30, 0])
.bindPopup(L.popup({
lazyload: '<img src="https://i.stack.imgur.com/shfxy.jpg?s=32&g=1" />'
}))
.addTo(map);
map.on('popupopen', function(e) {
var popen = e.popup;
if (popen.options.lazyload) {
popen.setContent(popen.options.lazyload);
}
});
html, body {
height: 100%;
margin: 0;
}
#map {
width: 100%;
height: 150px;
}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.3.1/leaflet.css"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.3.1/leaflet.js"></script>
<div id='map'></div>
实际上,在您用字符串内容填充弹出窗口的情况下(就像您对 .bindPopup('<img src="1.jpg"/>')
所做的那样),Leaflet 仅当弹出窗口首先在地图上打开。因此您的图像只会在那一刻加载,这正是您正在寻找的延迟加载行为。
所以你不需要在你的问题代码中做任何额外的事情:
(确保刷新页面/清除缓存以查看浏览器网络请求中的图像加载传递)
var map = L.map('map', {
center: [0, 0],
zoom: 1
});
var m = L.marker([-30, 0])
.bindPopup('<img src="https://i.stack.imgur.com/shfxy.jpg?s=32&g=1" />')
.addTo(map);
html, body {
height: 100%;
margin: 0;
}
#map {
width: 100%;
height: 150px;
}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.3.1/leaflet.css"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.3.1/leaflet.js"></script>
<div id='map'></div>