-1

在我的 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() 函数的经验,但看看它的描述 @ w3schools似乎很简单。但是,我得到以下行为:

markers.splice()什么也没做。那么我做错了什么?

而且,当markerIndex为 0 时,不显示确认框。起初,我假设冗长的 if 条件评估为 false,因此跳过了整个代码块,但是,使用 Firebug 逐步执行调用我发现当数组非空时,索引 0 的条件(当然)成立, 下一步显示if (confirm(...))andalert('deleting...)跳过并被markers.splice()调用(但没有任何反应)。这种行为太奇怪了,我决定打开这个问题。

谁能澄清发生了什么?

我认为删除标记将是人们可以做的最简单的功能。我可以添加它们,编辑它们的内容,甚至清除所有标记pop()markers数组中删除标记直到为空),一切都很好。

4

3 回答 3

2

您的代码的一个问题是 JavaScript 解释0 == ''为 true,因此对于markerIndex零,您的确认代码不会执行。我猜你误解了 Firebug 显示的步骤,或者它在这里只是有问题,因为你的 if 条件实际上将评估为 false 的 markerIndex 为 0。

您可以通过添加额外的来使用类型严格比较=

if (markerIndex !== '' && ...) {

一种更简单的方法是:

if (markers[markerIndex] !== undefined) {

因为 JavaScript 在访问未定义的对象成员时不会引发错误。

你不工作的另一个问题splice()很奇怪(它应该工作)。

于 2009-04-03T10:39:21.957 回答
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 暗示的相反)并且它按预期工作。我最亲爱的萤火虫误导了我。

于 2009-04-03T11:03:26.550 回答
-1

不确定这是否是这里发生的事情。但是我已经看到相同的代码在调试时在 firebug 中以不同的方式运行 v 在未调试时。我很确定我也没有干扰代码的手表。

于 2009-04-03T10:42:24.057 回答