在 Google Maps V3 API 标记鼠标悬停时获取鼠标光标的位置

Posted

技术标签:

【中文标题】在 Google Maps V3 API 标记鼠标悬停时获取鼠标光标的位置【英文标题】:Get Position of Mouse Cursor on Mouseover of Google Maps V3 API Marker 【发布时间】:2011-09-27 08:10:24 【问题描述】:

当光标悬停在使用 jQuery 的标记上时,我试图使 div 在光标位置可见。它有点像工具提示。但是我似乎无法弄清楚如何获取光标下方点的 X/Y 坐标。

当前代码:

google.maps.event.addListener(marker, "mouseover", function(event) 

    $("#tooltip").css(
        position: "absolute",
        top: event.pageY,
        left: event.pageX
    ).toggle();

我相信event 没有属性pageYpageX 就像jQuery 中的事件一样。

如何获取鼠标光标的位置?

【问题讨论】:

【参考方案1】:

在监听函数中加入如下代码:

// to display a tooltip:
marker.setTitle("Hi");

// to get the geographical position:
var pos = marker.getPosition();
var lat = pos.lat();
var lng = pos.lng();
// ...

【讨论】:

如何转换为相对于文档或 div 的 latlng 坐标? 我的第二个答案中介绍了转换“latlng -> 像素坐标”。【参考方案2】:

这是我之前关于像素位置计算的答案的扩展(Google maps API v3)。引入一个“全局”变量overlay

var overlay = new google.maps.OverlayView();
overlay.draw = function() ;
overlay.setMap(map); // 'map' is new google.maps.Map(...)

在监听器中使用overlay获取投影和像素坐标:

google.maps.event.addListener(marker, 'mouseover', function() 
    var projection = overlay.getProjection(); 
    var pixel = projection.fromLatLngToContainerPixel(marker.getPosition());
    // use pixel.x, pixel.y ... (after some rounding)
); 

你也可以看看projection.fromLatLngToDivPixel()

【讨论】:

我也用jquery解决了这个问题,没有google map api,但是你提出的解决方案更好:) 嗯,这里获取的不是鼠标光标的位置,而是监听事件的标记的位置 是的,我也想要鼠标位置,如果你真的想得到这个值@Robin我知道一个(非常老套的)方法来得到它。如果你愿意,我可以在这里发布。但它需要 jQuery,因为它涉及延迟事件。【参考方案3】:

对我有用的解决方案更直接:

map.data.addListener('mouseover', function (event) 
    posX = event.ub.clientX;
    posY = event.ub.clientY;
);

【讨论】:

这不再有效。您需要 event.wb.clientX,覆盖答案是唯一继续工作的答案。 您对 ub 和 wb 的看法是正确的。我会去尝试覆盖答案。【参考方案4】:

这给出了鼠标位置,对我有用。

function CanvasProjectionOverlay()  

CanvasProjectionOverlay.prototype = new google.maps.OverlayView();
CanvasProjectionOverlay.prototype.constructor = CanvasProjectionOverlay;
CanvasProjectionOverlay.prototype.onAdd = function ()  ;
CanvasProjectionOverlay.prototype.draw = function ()  ;
CanvasProjectionOverlay.prototype.onRemove = function ()  ;

在你的初始化函数中;

canvasProjectionOverlay = new CanvasProjectionOverlay();
canvasProjectionOverlay.setMap(map);

并像这样使用它;

google.maps.event.addListener(marker, 'mouseover', function(event)  
   var divPixel = canvasProjectionOverlay.getProjection().fromLatLngToContainerPixel(event.latLng);
   x = divPixel.x;
   y = divPixel.y;
); 

【讨论】:

我不知道为什么它对任何其他人都不起作用。这是完美的答案 请解释为什么这本质上不是 Jiri 答案的副本?它也像 Jiri 的回答一样,不提供鼠标坐标。它提供标记坐标。【参考方案5】:

这是一个使用单击事件的 MouseEvent 的解决方案,但不依赖于通过可随时更改的未记录属性访问该事件,例如“ub”或“wb”(我认为目前是“ya”)。

map.data.addListener('mouseover', function (e) 
    var keys = Object.keys(e);
    var x, y;
    for (var i = 0; i < keys.length; i++) 
        if (MouseEvent.prototype.isPrototypeOf(e[keys[i]])) 
            x = e[keys[i]].clientX;
            y = e[keys[i]].clientY;
        
    
);

【讨论】:

【参考方案6】:
mapObject.marker.addListener("mouseover", (event) => 
  //USE THE COORDINATES HERE =  lat: event.latLng.lat(), lng: event.latLng.lng();

【讨论】:

【参考方案7】:

当您将鼠标悬停在标记上时,event.domEvent.clientXevent.domEvent.clientY 会为您提供您在 DOM 上单击标记的位置。如果您减去偏移量,它将为您提供标记本身的中心点(以像素为单位)。

这将为您提供标记的准确中心点。

marker.addListener("mouseover", (event) => 
    const x = event.domEvent.clientX - event.domEvent.offsetX,
    const y = event.domEvent.clientY - event.domEvent.offsetY,
);

【讨论】:

以上是关于在 Google Maps V3 API 标记鼠标悬停时获取鼠标光标的位置的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Google Maps V3 中创建编号的地图标记?

google maps js v3 api教程 -- 在地图上添加标记

在 Google Maps API v3 中删除标记

Google Maps Api v3 - 查找最近的标记

Google Maps API v3 将地图重新​​定位到标记

在 google maps api v3 中隐藏方向服务中的标记