2011-09-04 64 views
0

我一直在研究一个涉及Google Maps API的简单项目。我的朋友需要访问者的地图,访问者可以在其中放置代表他们位置的标记。这些标记还与名称,消息等数据相关联。单击标记时,此数据应显示在InfoWindow中。Javascript字符串意外转向对象

到目前为止,它的所有工作都很好,但是我遇到了一个让我难过的bug。

当用户放下新点时,会调用一个函数来生成该对象特定的表单。

function setupForm(id){ 
    var content='<div class="gdform">'+ 
      '<form id='+id+'>'+ 
      '<ul>'+ 
      '<li><input type="text" id="userName" value="name" onfocus="value=\'\'"/></li>'+ 
      '<li><textarea rows ="15" cols="50" wrap="hard"></textarea></li>'+ 
      '</ul>'+ 
      '<input type="button" value="submit" onclick="markers.'+id+'.setData()"/>'+ 
      '<input type="button" value="cancel" onclick="setTimeout(function(){removeMark('+id+')}, 100)"/>'+ 
      '</form>'+ 
      '</div>'; 
return content; 

} 

其中id是地图上每个标记的唯一标识。这些标记存储在一个散列表中,并可以用这个ID引用。

这里的问题来自取消按钮。按下时,它应该关闭InfoWindow,从地图上移除标记,并从哈希表中删除标记。要做到这一点,它调用函数removeMark,它看起来像这样:

function removeMark(id){ 
    infoWindow.close() 
    markers.id.mark.setMap(null); 
    delete markers.id; 

} 

然而在这里,我收到一个类型的错误告诉我它无法读取的未定义的属性标志。

在尝试调试代码时,我设置了一些断点,一个在setupForm函数中,另一个在removeMark中。在单步执行代码时,我注意到,在setupForm中,js控制台将id识别为字符串。但是,在removeMark中,js控制台通知我,id突然成为对象。

我一直无法弄清楚为什么这应该是。 这里是所有代码:

http://jsfiddle.net/39vKm/

感谢您的帮助!

+0

你setTimeout调用是错误的。第一个参数应该是一个函数,而不是函数调用。 – ThiefMaster

+0

啊,好吧,我不知道你不能这么做......我已经改成setTimeout(function(){removeMark('+ id +')},100)'。然而,我仍然有与成为一个对象的字符串相同的问题... – danem

回答

1

好吧......有三个问题,你的代码...

首先,你错过了周围的onclick declatation的ID报价单上的取消按钮。其次,你需要从removeMark函数返回false,按钮上的onclick事件返回removeMark ...(有没有需要超时)

CODE:

function setupForm(id){ 
    var content='<div class="gdform">'+ 
       '<form id='+id+'>'+ 
       '<ul>'+ 
       '<li><input type="text" id="userName" value="Whats your name?" onfocus="value=\'\'"/></li>'+ 
       '<li><textarea rows ="15" cols="50" wrap="hard"></textarea></li>'+ 
        '</ul>'+ 
       '<input type="button" value="submit" onclick="markers.'+id+'.setData()"/>'+ 
       '<input type="button" value="cancel" onclick="return removeMark(\''+id+'\')"/>'+ 
       '</form>'+ 
       '</div>'; 
    return content; 

} 

三,拆卸时标记,你需要引用使用括号标记阵列上...

function removeMark(id){ 
    infoWindow.close() 
    markers[id].mark.setMap(null); 
    delete markers[id]; 
    return false; 
} 

更新小提琴:http://jsfiddle.net/gislikonrad/39vKm/5/

+0

啊,它完美的作品,感谢您的帮助。我只是想知道......为什么我的错误导致了我所看到的错误?另外,为什么有必要在removeMark上返回false? – danem

+0

尝试运行以下代码时发生错误:removeMarker(t1342352324)如果t1342352324是标记ID。问题是你没有引用id,这意味着代码运行了一个名为t1342352324的变量的removeMarker。然后,如果您在removeMark中没有返回false(并且随后未在onclick事件中返回removeMark),那么点击事件将在地图上再次运行,并且在取消按钮所在的地图上设置新标记。 .. – gislikonrad

+0

啊,好吧,所以这就是为什么它是我点击时添加一个新的标记。 setTimeout()最初是为了解决这个问题。谢谢您的帮助! – danem

相关问题