【问题标题】:Cannot read setMap property of undefined while using Google maps Javascript API使用 Google 地图 Javascript API 时无法读取未定义的 setMap 属性
【发布时间】:2014-11-18 06:27:57
【问题描述】:

我在页面加载时调用初始化函数。哪个正确设置了所有标记。然后我有一个搜索框和一个提交按钮,它清除所有标记,然后获取一个新的 JSON 对象,该对象由要创建的新标记组成。一旦我输入搜索查询并调用 getWorldTweets 函数,我就会收到此错误:

无法读取未定义的 setMap 属性

它指向 addMarker 和 deleteMarker 函数。

var map;
var marker;
var allmarkers = [];
var iterator = 0;
var riterator = 0;
var geocoder = new google.maps.Geocoder();

var search = {
  q: ""
};
function initialize() {
      var mapOptions = {
      //center: new google.maps.LatLng(-34.397, 150.644),
      center: new google.maps.LatLng(0,0),
      zoom: 2,
      //draggable: false,
      minZoom: 1
    };
  map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);
getWorldTweets();
}

function getWorldTweets(){
  deleteMarkers();
  iterator = 0;
  riterator = 0;
  $.ajax({
        type: 'POST',
        url: 'php/worldTweetsDatabaseHandler.php',
        data: search,
        dataType : 'json',
        success: function( res ) {
          console.log(res);
          for(var x in res){
            var myLatlng = new google.maps.LatLng(res[x]['LATITUDE'],res[x]['LONGITUDE']);
            marker = new google.maps.Marker({
            animation: google.maps.Animation.DROP,
            icon: "img/tweetmarker2.png",
            position: myLatlng,
            title: res[x]['TWEET_TEXT']
            });
            allmarkers.push(marker); 
          }
          setMarkersMap();
        }
    });
}

function addMarker(){
  allmarkers[iterator].setMap(map);
  iterator++;
}
function deleteMarker(){
  allmarkers[riterator].setMap(null);
  riterator++;
}

function setMarkersMap(){
  for(var i = 0;i<allmarkers.length;i++){
    setTimeout(function(){
      addMarker();
    },i*100);
    setTimeout(function(){
      deleteMarker();
    },i*500);
  }
}


function setAllMap(map){
  for(var i = 0;i<allmarkers.length;i++){
    //console.log("hello");
    allmarkers[i].setMap(map);
  }
}

function clearMarkers() {
  setAllMap(null);
}

function deleteMarkers() {
  console.log("in delete");
  clearMarkers();
  allmarkers = [];
}

$("#submit").on("click", function () { 
  search.q=document.getElementById('searchquery').value;
  //deleteMarkers();
  getWorldTweets(); 
});

$("#searchquery").keyup(function(event){
    if(event.keyCode == 13){
        $("#submit").click();
    }
});

$(document).ready(function() {
  $(window).keydown(function(event){
    if(event.keyCode == 13) {
      event.preventDefault();
      return false;
    }
  });
});

google.maps.event.addDomListener(window, 'load', initialize);

谁能告诉我出了什么问题。

谢谢。

【问题讨论】:

  • setMarkersMap - 您正在循环标记标记,添加它们,然后删除它们?你能解释一下这里发生了什么
  • 由于地图上有很多标记,我以更快的速度添加标记,然后以较慢的速度删除最旧的标记。
  • 你会遇到问题,我想从同一个数组中删除和添加
  • 什么样的问题?你能举个例子吗?到目前为止,一切正常。
  • 您每 100 毫秒调用一次 addMarker,每 500 毫秒调用一次 deleteMarker。你要处理多少个标记?例如,如果有 5 个,您将同时调用 addMarker 和 deleteMarker。全局变量allmarkers 会搞砸

标签: javascript google-maps google-maps-api-3


【解决方案1】:

添加所有标记后,全局变量 iterator 保存最新标记的索引。

如果在任何给定点您想丢弃旧标记集合并添加新集合,则需要将 iterator 重置为零,否则您将尝试设置超过allmarkers 数组。

例如

  1. 您的原始 getTweets 检索到 100 个标记。您的 allmarkers 数组有 100 个项目
  2. 您调用 setMarkersMap(),它会遍历 allmarkers 的 100 个标记。 iterator 设置为 100。
  3. 您又检索了 100 个标记。 allmarkers 现在是 200。
  4. 您调用 setMarkersMap() 以从 0 迭代到 200。iterator 已经为 100,将尝试升至 300。在标记 201 处,它将尝试对不存在的 allmarkers 索引进行操作

这里有几种方法:

  • 不要尝试在一个循环中对新旧标记进行操作。关闭旧的,然后打开新的。
  • 如果您想保存最后一批的索引,因此要使用全局变量,请不要从 0 迭代到 allmarkers.length,而是从 iterator 迭代到 allmarkers.length
  • 如果您永远不需要一批旧的标记,不要只是将它们的地图设置为空。将它们从您的阵列中取出

.

while(allmarkers.length) {
  var oldMarker=allmarkers.pop();
  oldMarker.setMap(null);
  // delete oldMarker;  // optionally delete it, allegedly it's unnnecesary.
}

如果您执行后者,那么您将始终在 0-100 批次上操作。

【讨论】:

  • 感谢@amenadiel 的详细回复。在deleteMarkers 函数中,我正在清除数组allmarkers。另外,我在getWorldTweets 函数中调用deleteMarkers。因此,当检索到新推文时,allmarkers 被清空,iteratorriterator 都设置为 0。
  • 你说得对,我错过了重置。也许你可以console.log(allmarkers[iterator]); 来检查数组的那个位置是否有一个实际的标记
  • 所以我将console.log(iterator);console.log(allmarkers[iterator]); 放入addmarker 方法中。它完美地迭代了所有标记的大小,但它并没有就此停止。它继续前进,所以我收到这样的错误35 Sn {gm_accessors_: Object, animation: 2, gm_bindings_: Object, icon: "img/tweetmarker2.png", position: kf…} 36 Sn {gm_accessors_: Object, animation: 2, gm_bindings_: Object, icon: "img/tweetmarker2.png", position: kf…} 37 undefined Uncaught TypeError: Cannot read property 'setMap' of undefined (1/2)
  • 37 undefined Uncaught TypeError: Cannot read property 'setMap' of undefined 37 undefined Uncaught TypeError: Cannot read property 'setMap' of undefined 37 undefined Uncaught TypeError: Cannot read property 'setMap' of undefined (2/2)
  • 我猜你可以验证 allmarkers[iterator] 与 undefined 不同...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 2021-07-13
  • 2021-06-25
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
相关资源
最近更新 更多