在我的Google地图应用程序中,我可以在地图上放置标记,并保留对放置的每个标记的引用,以及名为markers
的数组中的一些额外信息。
添加标记很简单,我只是push()
新创建的对象到数组(markers.push(marker)
);
但是,当从数组中删除任意标记时,给定插槽的索引,它不会按预期运行。我的职责是:
function deleteMarker(markerIndex) {
if (markerIndex!='' && markerIndex>=0 && markerIndex<markers.length) {
if (confirm('Do you really want to remove this marker from the map?')) {
alert('deleting marker '+markerIndex); //debugging purposes
markers.splice (markerIndex, 1);
}
}
}
我以前没有使用splice()函数的经验,但是看its description @ w3schools它似乎很简单。但是,我得到以下行为:
markers.splice()
什么也没做。那么我做错了什么?
此外,当markerIndex
为0时,不会显示确认框。起初我假设冗长的if条件被评估为false,因此整个代码块被跳过,但是,使用Firebug来逐步调用我发现当数组非空时条件为0的条件(当然) ,下一步显示if (confirm(...))
和alert('deleting...)
被跳过并且markers.splice()
被调用(但没有任何反应)。这种行为很奇怪我决定打开这个问题。
任何人都可以澄清一下发生了什么吗?
我认为删除标记将是最容易实现的功能。我可以添加它们,编辑它们的内容,甚至清除所有标记(pop()
- 从markers
数组中取出标记直到空白,并且一切正常。
答案 0 :(得分:2)
代码的一个问题是JavaScript将0 == ''
解释为true,因此对于markerIndex
为零,您的确认代码不会被执行。我猜你错误解释了Firebug显示的步骤,或者它只是在这里有错误,因为你的if条件实际上会因为markerIndex为0而评估为false。
您可以通过添加额外的=
来使用类型严格比较:
if (markerIndex !== '' && ...) {
更简单的方法是:
if (markers[markerIndex] !== undefined) {
由于JavaScript在访问未定义的对象成员时不会引发错误。
splice()
无法正常工作的其他问题很奇怪(应该可行)。
答案 1 :(得分:0)
function deleteMarker(markerIndex) {
if (markers[markerIndex] !== undefined) {
if (confirm('Do you really want to remove this marker from the map?')) {
map.removeOverlay(markers[markerIndex]);
markers.splice (markerIndex, 1);
}
}
}
这似乎可以解决所有问题。谢谢你的回答,非常感谢。 我特别喜欢将第一个if条件简化为:
的想法 if (markers[markerIndex] !== undefined)
splice()
似乎直接在阵列上运行(与NuclearDog暗示的相反)并且它按预期工作。我最亲爱的Firebug误导了我。
答案 2 :(得分:-1)
不确定这是否是这里发生的事情。但我已经看到相同的代码在firebug中运行时在调试v时没有被调试。我很确定我没有任何干扰代码的手表。