【问题标题】:Everytime I refresh page items duplicates in local storage每次我刷新页面项目在本地存储中重复
【发布时间】:2021-08-29 03:54:10
【问题描述】:

我知道代码很乱,我在某个地方找到了它。而且我看到很多函数被多次调用,我不知道如何解决这个问题。我从未与 localStorage 合作过,但我需要这个时间。当我刷新在 localStorage 中重复的页面项目时,它会使网站出现故障,实际上无法使用。如果有人知道如何优化它,我将不胜感激。

var map,
    markersAll = [];

function initMap() {
  map = new google.maps.Map(document.getElementById('map'), {
    zoom: 4,
    center: {lat: -25.363, lng: 131.044}
  });

  renderMarkers();

  map.addListener('click', function(e) {
    var lat = e.latLng.lat();
    var lng = e.latLng.lng();    
    generateMarker(lat, lng);    
    //console.log(lat, lng);
  });  
}

let markers = getMarkersFromLocalStorage()
console.log(markers)
function getMarkersFromLocalStorage(){
  return localStorage.markers ? JSON.parse(localStorage.markers) : []
}

function addMarkerToLocalStorage(lat, lng) {
  markers.push({lat, lng});
  localStorage.markers = JSON.stringify(markers);
};

function removeMarkerFromLocalStorage(lat, lng) {
  let newMarkers = [];
  markers.forEach(function(marker) {
    if(marker.lat != lat && marker.lng != lng) {
      newMarkers.push({
        lat: marker.lat,
        lng: marker.lng
      });
    }
  });

  localStorage.markers = JSON.stringify(newMarkers);
};

function clearMarkers() {
  markersAll.forEach((marker) => {
    marker.setMap(null);
  });
};

function renderMarkers() {
  markers.forEach(function(marker) {
    console.log(marker.lat, marker.lng);
    generateMarker(marker.lat, marker.lng);
  });
};

var marker
var icon = {
  path: google.maps.SymbolPath.FORWARD_CLOSED_ARROW,
  strokeColor: "blue",
  scale: 3
}

function generateMarker(lat, lng) {
  marker = new google.maps.Marker({
    position: {lat: lat, lng: lng},
    map: map,
    icon: icon
  }); 
    marker.setMap(map);
    markersAll.push(marker);
    addMarkerToLocalStorage(lat, lng);
    // changing icon on click

  marker.addListener('rightclick', function(e) {
    var lat = e.latLng.lat();
    var lng = e.latLng.lng();
    //console.log('right click', lat, lng);
    clearMarkers();
    removeMarkerFromLocalStorage(lat, lng);
    // renderMarkers();    
  });   
  
  marker.addListener('click', changeColor);

};

function changeColor(evt) {
  this.setIcon(pinSymbol('blue'));
}

function pinSymbol(color) {
    return {
        path: 'M 0,0 C -2,-20 -10,-22 -10,-30 A 10,10 0 1,1 10,-30 C 10,-22 2,-20 0,0 z',
        fillColor: color,
        fillOpacity: 1,
        strokeColor: '#000',
        strokeWeight: 2,
        scale: 1
    };
}
// clear all markers
document.getElementById('clear-all-markers').addEventListener('click', clearAllMarkers)
function clearAllMarkers(){
  localStorage.clear()
}

【问题讨论】:

    标签: javascript google-maps local-storage google-maps-markers


    【解决方案1】:

    每次您的页面运行时,它都会创建标记并将它们添加到本地存储中。

    function addMarkerToLocalStorage(lat, lng) {
      markers.push({lat, lng});
      localStorage.markers = JSON.stringify(markers);
    };
    

    上面的函数就是这样做的。但是这个函数没有任何逻辑来检查标记是否存在,并且不知道用例是什么,我不确定它的意思。

    代码有清除所有标记的功能

    // clear all markers
    document.getElementById('clear-all-markers').addEventListener('click', clearAllMarkers)
    
    function clearAllMarkers(){
      localStorage.clear()
    }
    

    但这附在上面显示的“清除所有标记”按钮上。

    您可以通过调用 clearAllMarkers(); 来强制代码自动清除标记。代码最顶部的函数;像这样:

    var map,
        markersAll = [];
    clearAllMarkers(); // this will clear local storage
    

    另一种选择是更改 addMarkerToLocalStorage 代码,以便它检查标记是否存在,这将防止许多标记从一个位置存在 - 这可能不是您想要的用例

    function addMarkerToLocalStorage(lat, lng) {
      var add = true;
      // check if this marker exists!
      markers.forEach(function(marker){
        if (marker.lat===lat && marker.lng===lng) add=false;
      })
      // did we find the marker? exit
      if (add===false) return;
      markers.push({lat, lng});
      localStorage.markers = JSON.stringify(markers);
    };
    

    我猜选项二可能是您需要的,但根据您提供的信息,我不知道这段代码的用例是什么。

    【讨论】:

    • 我只是想在某处单击并将其保存到 localStorage,当我返回到同一位置时。并在右键单击时将其删除以在单击时更改颜色
    • 如果你检查我已经更新了我的答案,所以它不会一遍又一遍地添加相同的标记。尝试使用 addMarkerToLocalStorage 的新代码...此代码未经测试,但应该可以解决问题
    • 现在可以使用 if 语句谢谢!
    • 这是基于它不会在您重新加载时不断添加相同的标记。听起来您需要更复杂的代码解决方案。但我现在这回答了你的问题。
    • 如果您不介意,还有一个问题。当我右键单击删除它们时,我成功删除了它们,但所有标记都消失了,所以我需要刷新以查看剩下的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 2021-08-09
    • 1970-01-01
    • 2022-07-12
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    相关资源
    最近更新 更多