【Leaflet】ポップアップの内容を後から変更する
2023-6-19 | JavaScript, Leaflet
Leafletでポップアップの内容を後から変更したい!
概要
今回の記事では、Leafletでポップアップの内容を後から変更する手順を掲載する。
仕様書
環境
- Leaflet 1.7.1
手順書
右上の「Change Popup」ボタンをクリックするとランドマークのポップアップの文字列が切り替わるサンプル。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Leaflet Test</title>
<style>
.menu-right {
border: solid 1px;
background-color: #ffffff;
border-radius: 4px;
padding: 8px;
color: #000000;
}
</style>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script>
<script>
var marker;
var map;
var is_ja = false;
function init()
{
var xy2lat = function (x, y) {
return map.unproject([x, y], 4);
};
var image = {
url: "https://blog.nekonium.com/wp-content/uploads/catacombs_of_the_cursed_witch.png",
width: 2030,
height: 2730,
};
map = L.map("leaflet-container", {
crs: L.CRS.Simple,
minZoom: -1,
maxZoom: 5,
});
var imageBounds = L.latLngBounds([map.unproject([0, image.height], 4), map.unproject([image.width, 0], 4)]);
map.fitBounds(imageBounds);
map.setMaxBounds(imageBounds.pad(0.5));
L.imageOverlay(image.url, imageBounds).addTo(map);
var menuRight = L.control({ position: "topright" });
menuRight.onAdd = function (map) {
this.ele = L.DomUtil.create("div", "menu-right");
this.ele.id = "id_menu_right";
return this.ele;
};
menuRight.addTo(map);
document.getElementById("id_menu_right").innerHTML = "<button onclick='changePopup();'>Change Popup</button>";
var custom_pin = L.icon({
iconUrl: 'https://blog.nekonium.com/wp-content/uploads/custom-pin.png',
iconSize: [32, 32],
iconAnchor: [16, 31],
popupAnchor: [0, -31],
});
marker = L.marker(xy2lat(827, 515), { icon: custom_pin }).addTo(map).bindPopup("Water room", {closeOnClick: false}).openPopup();
}
}
function changePopup()
{
marker.bindPopup(is_ja ? "Water room" : "水の部屋").openPopup();
is_ja = !is_ja;
}
</script>
</head>
<body onload="init()">
<div id="leaflet-container" style="position: absolute; top: 0; left: 0; right: 0; bottom: 0"></div>
</body>
</html>
解説
マーカーのインスタンスを変数に保存しておいて、後から再度bindPopup
関数でポップアップの内容を再設定するだけ。
marker.bindPopup(is_ja ? "Water room" : "水の部屋").openPopup();
is_ja = !is_ja;
おまけなんだけども、インスタンス化する際にcloseOnClick
オプションをfalse
するとポップアップ外をクリックしてもポップアップが閉じなくなる。このオプションを設定しないと「Change Popup」ボタンをクリックした時にポップアップが閉じてしまって、ポップアップの中身を確認するのに再びマーカーをクリックする必要がありめんどう。
marker = L.marker(xy2lat(827, 515), { icon: custom_pin }).addTo(map).bindPopup("Water room", {closeOnClick: false}).openPopup();
デモ
CODEPENで動かしてみると下記のような感じ。
See the Pen
Leaflet Change Popup Test by 108nen (@108nen)
on CodePen.
まとめ(感想文)
言語を切り替えるのに使えるかもね!