【问题标题】:deleting a marker after confirmation infowindow确认信息窗口后删除标记
【发布时间】:2014-06-26 20:04:21
【问题描述】:

来自 jsFiddle 的另一个 {"error": "Please use POST request"} 阻止了我在得到用户确认后删除 google-maps-api-3 标记的尝试。 My jsFiddle code is here。您可以先通过单击地图创建一个或多个标记,然后右键单击其中一个标记来查看错误。最后,点击“删除”按钮。

代码borrows heavily from this code

编辑

3 处更正。

  1. 正如评论中指出的,我没有更新 jsFiddle。可以在/5/ 找到更正的版本。主要的区别是监听器中“右键单击”的代码行被注释掉了,因为它应该一直都是。

  2. 下面对注释掉一行代码进行了同样的修正。

  3. 除非我手动更改 jsfiddle 代码(例如完全删除注释掉的行),否则我不再收到错误“{”错误“:”请使用 POST 请求“}”,然后控制-return,然后尝试添加和删除标记。所以这不再是一个问题,我相信。相反,新问题是,如果有多个标记并且我只单击其中一个并请求删除它,那么 all 标记将被删除。所以我真的需要一些帮助来完成我删除标记的目标,一次删除一个。

下面的代码

编辑

var map
var infowindow;
var markers = [];

function initialize() {

    var NY = new google.maps.LatLng(40.739112, -73.785848);
    map = new google.maps.Map(
    document.getElementById('map-canvas'), {
        center: NY,
        zoom: 16,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    });

    google.maps.event.addListener(map, 'click', function (event) {
        addMarker(event.latLng);
    });
}

function addMarker(location) {

    var marker = new google.maps.Marker({
        position: location,
        map: map
    });
    markers.push(marker);

    var delform = marker.getPosition() + '<br />' + '<form onsubmit="processdel(this,marker); return false" action="#">' + '  <input type="submit" id="delid" value="Delete" />' + '<\/form>';

    infowindow = new google.maps.InfoWindow({
        content: delform,
        size: new google.maps.Size(50, 50)
    });
    google.maps.event.addListener(marker, 'rightclick', function (event) {
        infowindow.open(map, marker);

        // marker.setMap(null); This is the line that was NOT supposed to be in the code.
    });
}

function processdel(form, marker) {

    infowindow.close();
    marker.setMap(null);
    marker = null;
}


initialize();

【问题讨论】:

  • 看起来你没有“更新”你的 jsfiddle。 code there 很无聊。这可能就是你想要的updated jsfiddle
  • 感谢您的提醒。我是 jsFiddle 的新手,不知道更新的要求。此外,正如您在编辑后的问题中看到的那样,更新后我得到了新的坏结果。
  • 它不会被删除。您只是通过使用表单提交来刷新页面。因此,您的地图会再次加载而没有任何标记。
  • @MrUpsidown 这令人惊讶,但您可能是对的。无论如何,我想我可能已经找到了答案here,并且它包含了它自己的 jsFiddle 演示。显然我必须构建一个包含所有标记的markers 对象。哦,顺便说一句,我查看了您对问题的编辑,我只能看到看起来并不重要的格式更改。你有什么实质性的补充吗?
  • 不。我永远不会更改您的代码中的任何内容。这是你问题的一部分。我只是正确缩进它。您对实际上是一个数组的标记“对象”是正确的,但是您已经这样做了。我将在几秒钟内添加一个答案以进一步解释。

标签: javascript google-maps-api-3


【解决方案1】:

几个规则来实现你想要的。

  1. 只创建一个infowindow对象实例,并使用setContent()方法修改其内容。

  2. 使用信息窗口的domready 事件将任何操作绑定到信息窗口中的元素。

  3. 为每个标记添加一个 ID,以便您能够单独识别每个标记。我在下面的示例中使用了一个简单的计数器。每次创建标记时增加它。

首先创建 infowindow 实例和一个计数器:

var infowindow = new google.maps.InfoWindow();
var counter = 0;

然后创建具有特定 ID 的每个标记,并在信息窗口按钮上使用该 ID:

function addMarker(location) {

    counter++;

    var marker = new google.maps.Marker({
        position: location,
        map: map,
        id: counter
    });

    markers.push(marker);

    var deleteButton = '<button id="deleteButton" data-id="' + counter + '">Delete</button>';

    google.maps.event.addListener(marker, 'rightclick', function () {
        infowindow.setContent(deleteButton);
        infowindow.open(map, marker);
    });
}

然后你需要监听 infowindow 的domready 事件,使用你从按钮获得的标记 id 调用你的删除函数,最后循环遍历你的标记数组以删除适当的标记。

JSFiddle demo

【讨论】:

  • 我编辑了您的 JSFiddle see this one 以使用 var markers = {} 而不是 [](就像 @Fatih 一样)。我不确定 function deleteMarker(markerId) 中的更改是否有必要这样做,但更改消除了 forloop 查找的需要。对于大多数应用程序来说,这样的改变会有效吗?关于您只需要一个信息窗口的一个问题。我可以有另一个独立的信息窗口供用户为其按钮提供文本,命名为别的吗?也就是说,一个信息窗口的限制是否特定于删除?
  • 我被困在收听domready 事件的部分。我认为那是因为我不使用 jQuery,所以小提琴中的这段代码对我不起作用:google.maps.event.addListener(infowindow, 'domready', function () { $("#deleteButton").click(function() { deleteMarker($(this).data('id')); }); }); }你能帮忙吗?
  • 好的,我得到了关于避免使用 jQuery 的问题,但现在看来,这种方法只允许一个全局信息窗口的问题对我来说是一个大问题。是否有另一种设计使用不同的信息窗口进行相对于标记创建的删除?
  • markers 是一个数组,你把它变成了一个对象。这不会改变任何关于循环的事情。改变的是你使用计数器作为数组键/对象属性,这实际上比我一开始做的更聪明(不需要循环)。现在你说的大问题是什么?
猜你喜欢
  • 2012-05-08
  • 1970-01-01
  • 1970-01-01
  • 2016-07-09
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
  • 2016-07-27
  • 2013-09-02
相关资源
最近更新 更多