如何在Google地图标记上检测长按?

5
我猜Google地图没有长按/按住事件处理程序。下面的代码是实现这个功能的一种方法吗?

这是实现此操作的一种方法吗? - Alexander Tobias Bockstaller
嗨,亚历山大,我想在谷歌地图标记上检测长按事件。 - Anbarasan Thangapalam
请编辑您的问题(请参见标签下方的编辑链接),并添加您尝试过的代码。同时解释一下您期望代码做什么以及为什么现在卡住了。目前您的问题写得不太可能得到任何答案。 - Alexander Tobias Bockstaller
@AlexanderTobiasHeinrich:感谢您的帮助。 - Anbarasan Thangapalam
现在看起来好多了,但如果它按照您的预期工作,您可能不会在这里发布问题,对吧?您能详细说明一下上面代码中的问题吗? - Alexander Tobias Bockstaller
@AlexanderTobiasHeinrich:我已经编辑了问题并标记了答案。感谢您的指导!! - Anbarasan Thangapalam
4个回答

13

我知道这是一个旧帖子,但我遇到了同样的问题,我找到了比@Anbarasan Thangapalam建议的更好的解决方案。

解决方案:

var mousedUp = false;
google.maps.event.addListener(marker, 'mousedown', function(event){ 
    mousedUp = false;
    setTimeout(function(){
        if(mousedUp === false){
            //do something if the mouse was still down
            //after 500ms        
        }
    }, 500);
});
google.maps.event.addListener(marker, 'mouseup', function(event){ 
    mousedUp = true;
});

我认为这种方法可能更易于理解,代码行数更少,监听函数也更少。

为了避免在拖动事件上触发超时函数,只需复制 mouseup 函数并将其更改为 dragstart。像这样:

google.maps.event.addListener(marker, 'dragstart', function(event){ 
    mousedUp = true;
});

1
这个完美地运行了,感谢你花时间发布你的解决方案! - Davey

13

我使用鼠标按下和鼠标释放事件监听器实现了长按功能。谢谢!!

var longpress = false;
        
google.maps.event.addListener(marker,'click', function (event) {
    (longpress) ? console.log("Long Press") : console.log("Short Press");
});
        
google.maps.event.addListener(marker, 'mousedown', function(event){
    start = new Date().getTime();           
});
        
google.maps.event.addListener(marker, 'mouseup', function(event){
    end = new Date().getTime();
    longpress = (end - start < 500) ? false : true;         
});

对我来说,这个方案完美地解决了问题(在添加监听器以重置拖动开始和结束事件后),而rafamds的解决方案则有些不稳定。 - Jack

1
我使用了Rafaelmorais的解决方案(带有拖动监听器),但我认为触发标志“mousedUp”的第一个声明应该是true。我更改了该触发变量(还将其重命名为更加直观),它可以正常工作。
一些注意事项供您参考...
在长按事件被释放后,也会触发单击事件(如果您设置了单击监听器)。为了防止双重事件,您可以在单击监听器中使用(!longPressed)来抑制单击事件运行(如果您想要)。
我清除了超时以防止函数检查longPressActive是否仍然为true,并且已经取消/重置并仍然触发事件的奇怪实例。
Mousedown事件与任何鼠标按钮一起触发(对于触摸事件不相关)。
Dragend不是必需的,因为dragstart清除了超时。
var longPressTimeout = null;
var longPressActive = false;
var longPressed = false;

google.maps.event.addListener(marker, 'mousedown', function(event){
    longPressActive = true;
    longPressed = false;
    longPressTimeout = setTimeout(function(){
        if(longPressActive === true){
            console.log("Long Press")
            longPressed = true;
            //do something after marker long pressed for 1000ms
        }
    }, 1000);
});

google.maps.event.addListener(marker, 'mouseup', function(event){
    clearTimeout(longPressTimeout); 
    longPressActive = false;
});

google.maps.event.addListener(marker, 'dragstart', function(event){
    clearTimeout(longPressTimeout); 
    longPressActive = false;
});

我发表这篇文章作为解决方案,因为我还没有足够的声望来发表评论。


0

对我来说,以下方法有效。要查看它是右键单击还是长按,只需在处理程序中检查事件类型是否为"contextmenu"。

gMaps.event.addListener(overlay, 'click', function() {
    if(event.type === "contextmenu"){
     //longpress handler codes
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接