【问题标题】:Leaflet delete element from sidebar传单从侧边栏中删除元素
【发布时间】:2022-01-27 04:51:05
【问题描述】:

我有一个应用程序可以通过保存按钮将 Leaflet 地图的中心坐标保存到侧边栏。

我想单击任意坐标并使用侧边栏中的键盘按钮进行删除。控制侧边栏的代码sn-p:

function createSidebarElements(layer) {
  const el = `<div class="sidebar-el" data-marker="${layer._leaflet_id}">${layer
    .getLatLng()
    .toString()}</div>`;

  const temp = document.createElement("div");
  temp.innerHTML = el.trim();
  const htmlEl = temp.firstChild;

  L.DomEvent.on(htmlEl, "dblclick", zoomToMarker);

  sidebar.insertAdjacentElement("beforeend", htmlEl);
}

function zoomToMarker(e) {
  const clickedEl = e.target;
  const markerId = clickedEl.getAttribute("data-marker");
  const marker = fg.getLayer(markerId);
  const getLatLong = marker.getLatLng();
  marker.addTo(map);

  marker.bindPopup(getLatLong.toString()).openPopup();
  map.panTo(getLatLong);
}

完整的 script.js:

let config = {
  minZoom: 7,
  maxZoom: 18,
};
// magnification with which the map will start
const zoom = 18;
// co-ordinates
const lat = 0;
const lng = 0;

const map = L.map("map", config).setView([lat, lng], zoom);

L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", {
  attribution:
    '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors',
}).addTo(map);

map
  .locate({
    setView: true,
    enableHighAccuracy: true,
  })
  .on("locationfound", (e) => {
    console.log(e);
    // marker
    const marker = L.marker([e.latitude, e.longitude]).bindPopup(
      "Your are here :)"
    );
  })
  // if error show alert
  .on("locationerror", (e) => {
    console.log(e);
    alert("Location access denied.");
  });

// --------------------------------------------------

const sidebar = document.getElementById("sidebar");

function createSidebarElements(layer) {
  const el = `<div class="sidebar-el" data-marker="${layer._leaflet_id}">${layer
    .getLatLng()
    .toString()}</div>`;

  const temp = document.createElement("div");
  temp.innerHTML = el.trim();
  const htmlEl = temp.firstChild;

  L.DomEvent.on(htmlEl, "dblclick", zoomToMarker);

  sidebar.insertAdjacentElement("beforeend", htmlEl);
}

function zoomToMarker(e) {
  const clickedEl = e.target;
  const markerId = clickedEl.getAttribute("data-marker");
  const marker = fg.getLayer(markerId);
  const getLatLong = marker.getLatLng();
  marker.addTo(map);

  marker.bindPopup(getLatLong.toString()).openPopup();
  map.panTo(getLatLong);
}

const fg = L.featureGroup().addTo(map);

document.addEventListener("DOMContentLoaded", function () {
  updateInfo();
});

const markerPlace = document.querySelector(".center-of-map-description");

function updateInfo() {
  const { lat, lng } = map.getCenter();
  const zoom = map.getZoom();
  markerPlace.innerHTML = `center: ${lat.toFixed(5)}, ${lng.toFixed(
    5
  )} | zoom: ${zoom}`;
}

const customControl = L.Control.extend({
  // button position
  options: {
    position: "topright",
  },

  // method
  onAdd: function (map) {
    const btn = L.DomUtil.create("button");
    btn.title = "Save location";
    btn.textContent = "Save";
    btn.className = "SaveButton";
    btn.setAttribute(
      "style",
      "background-color: white; width: 33px; height: 20px; border: none; display: flex; cursor: pointer; justify-content: center; font-size: 1rem;"
    );

  
    btn.onmouseover = function () {
      this.style.transform = "scale(1.3)";
    };

    
    btn.onmouseout = function () {
      this.style.transform = "scale(1)";
    };

    btn.onclick = function (){

      const marker = L.marker(map.getCenter()).addTo(fg);
      marker.remove();
      createSidebarElements(marker);
    };

    return btn;
  },
});
map.addControl(new customControl());

style.css:

*,
:after,
:before {
    box-sizing: border-box;
    padding: 0;
    margin: 0;
}

html {
    height: 100%;
}

body,
html,
#map {
    width: 100%;
    height: 100%;
}

body {
    position: relative;
    display: flex;
    justify-content: center;
    flex-direction: column;
    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial,
    sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
    min-height: 100%;
    margin: 0;
    padding: 0;
    background-color: #f1f1f1;
}

.mapid {
    min-height: 100%;
}

.flex {
    display: flex;
    flex-direction: row;
}

.mapid #map {
    width: calc(100% - 20%);
}

#sidebar {
    width: 20%;
    background: #fff;
}

.sidebar-el {
    padding: 5px 10px;
    background: #fff;
    cursor: pointer;
}

.sidebar-el:hover {
    background: #f1f1f1;
}

.center-of-map:before {
    position: absolute;
    content: "\271B";
    z-index: 990;
    display: flex;
    justify-content: center;
    align-items: center;
    width: 100%;
    height: 100%;
    font-size: 4rem;
}

.center-of-map-description {
    background: #fff;
    margin: 0 !important;
    padding: 2px 10px;
}

index.html:

    <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>sidebar</title>
    <link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" />
    <link rel="stylesheet" href="style.css">
    <script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script>
</head>

<body>
<div class="flex mapid">
    <div id="map" class="center-of-map"></div>
    <div id="sidebar"></div>
</div>
<script src="script.js"></script>
</body>
</html>

【问题讨论】:

    标签: javascript html css node.js leaflet


    【解决方案1】:

    如果我理解正确,单击边栏中的坐标也会从边栏中删除按钮。由于我的代码被复制了,我会这么说;)你的代码中有zoomToMarker函数,你有一个clickedEl元素的句柄,只需使用remove()就可以了。

    下面是整个代码:

    function zoomToMarker(e) {
      const clickedEl = e.target;
      const markerId = clickedEl.getAttribute("data-marker");
      const marker = fg.getLayer(markerId);
      const getLatLong = marker.getLatLng();
    
      marker.bindPopup(getLatLong.toString()).openPopup();
      map.panTo(getLatLong);
    
      clickedEl.remove();
    }
    

    【讨论】:

    • 我想在点击坐标并按下键盘按钮后删除。但是 clickedEl.remove() 有效。我只是添加了一个键盘监听器,它可以按需要工作。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多