Google地图事件监听器不会被删除

时间:2017-03-24 18:22:43

标签: javascript google-maps google-maps-api-3

我无法理解为什么setgeometry事件中的mouseup事件会在rightlick事件后继续触发...即使我确实删除了setgeometry事件侦听器

drawLayer.addListener('mouseup', function() {
    changedGeom = drawLayer.addListener('setgeometry', function(e) {
        console.log('got new geometry');
        google.maps.event.removeListener(changedGeom);
    });
});

drawLayer.addListener('rightclick', function(e) {
    console.log('deleted polygon');
    google.maps.event.removeListener(changedGeom);
});

我在setgeometrymouseup的原因是因为我只想要多边形的最后位置。否则它将记录每一步。

也许我已经过度复杂了,但是这里有什么可以重现这个问题:

  1. 打开控制台并在Google地图上拖动多边形。您应该看到获取新几何消息一次。
  2. 现在右键单击鼠标,您应该看到消息删除多边形
  3. 现在再次移动多边形。您将看到setgeometry事件持续触发,导致大量获得新的几何消息。
  4. 我不确定为什么会这样。有人可以解释一下吗?

    演示:http://jsfiddle.net/8ueq6spu

1 个答案:

答案 0 :(得分:0)

我已经弄清楚为什么会发生这种情况。

我删除了您的rightclick侦听器,看到在右键单击操作时仍然触发了某个事件,然后我意识到这是因为左键单击和右键单击都会导致mouseup事件。< / p>

因此,在您当前的实现中,将在rightclick按下/事件中删除侦听器,但是由于mouseup事件释放按钮后会立即创建一个新实例。

要解决此问题,您可以选择标准click而不是mouseup,但是,我还注意到当您拖动边界节点时此事件不会触发(这可能是您使用的原因)首先是mouseup

快速解决方法仍然是使用mouseup事件,但会检测事件源自哪种类型的点击。

drawLayer.addListener('mouseup', function(e) {
    if (e.which === 1) {
        console.log("Left click");
    } else if (e.which === 2) {
        console.log("Middle click");
    } else if (e.which === 3) {
        console.log("Right click");
    }
});