我在页面加载时调用初始化函数。它正确设置了所有标记。然后我有一个搜索框和一个提交按钮,该按钮清除所有标记,然后获取一个新的 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);
有人可以告诉我出了什么问题吗?
谢谢你。
添加所有标记后,全局变量
iterator
保存最新标记的索引。
如果在任何给定点您想要丢弃旧标记集合并添加新集合,则需要将
iterator
重置为零,否则您将尝试设置超过 长度的索引的映射allmarkers
数组。
例如
allmarkers
数组有 100 个项目allmarkers
的 100 个标记。 iterator
设置为 100。allmarkers
现在是200。iterator
已经在 100,将尝试上升到 300。在标记 201 处,它将尝试对不存在的索引 allmarkers
您可以通过多种方式前往这里:
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 批次进行操作。