检测Google Maps V3多边形鼠标事件的Shift键

3
有没有办法在使用Google Maps V3(.16) JavaScript API时检测多边形的Shift+鼠标单击事件? https://developers.google.com/maps/documentation/javascript/reference#MouseEvent 我确实收到了鼠标事件,并且可以看到原始事件被包装在google事件类中,这正是所需(访问event.Ua.shiftKey属性)。
但我发现,上个月谷歌可能已经更新了他们的API,现在该属性已经更名为event.Pa.shiftKey。
请参见http://i.stack.imgur.com/80npD.png以获取Web Inspector中事件结构的屏幕截图。是否有任何方法可以使用事件检测在单击Google Maps多边形时是否按下Shift键,而不必依赖于谷歌未更新其API?我错过了什么?
谢谢!
4个回答

5

使用未记录的属性几乎总是不明智的。如果可能避免,就尽量避免。在这种情况下,API 可能与闭包编译器一起压缩,因此在下次更新时,它也可能不再是Pa

是否有办法检测通过事件单击 Google 地图多边形时是否按下 shift 键,而无需依赖于谷歌未更新其 API?

如果只是 Ua vs. Pa

您可以进行特性检测:

var shiftKey = (event.Ua || event.Pa).shiftKey;

这段代码使用了JavaScript的奇妙强大的 ||运算符 来引用Ua属性的值,如果有并且是真值,否则引用Pa属性的值。

这个假设是他们将其从Ua更改为Pa时不会将Ua用于其他用途。如果有这样的可能性,那么这个更彻底的版本可以解决问题:

var shiftKey = ((event.Ua && 'shiftKey' in event.Ua) ? event.Ua : event.Pa).shiftKey;

这段代码专门检查具有shiftKey属性的Ua对象,如果没有找到,则退而求其次使用Pa。

如果它可以是任何东西

... 您可以搜索它:

var shiftKey;
if (Object.keys(event).some(function(key) {
      if (event[key] && 'shiftKey' in event[key]) {
          shiftKey = event[key].shiftKey;
          return true;
      }
      return false;
  })) {
    // We found it, `shiftKey` has the value
} else {
    // We didn't find it
}
< p > 旁注: < code > Object.keys 是一种 ES5 功能,可在所有现代浏览器中使用。如果您需要支持旧浏览器(如 IE8),可以进行 polyfill。 < /p >

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Ronald
的确,看起来事件对象的结构已经完全改变了,使得上述方法不再有用。 - Simon H

1

我最终采用了与amenadiel的答案接近的解决方案。我认为不依赖于所有可能的丑化变量名会更好,而是要寻找一个是MouseEvent的变量,并使用它来检查shiftKey属性,像这样:

function polygonListener(polygonEvent) { 
  var shiftKey = false;
  for(var i in polygonEvent){
    if(polygonEvent[i] instanceof window.MouseEvent){
      shiftKey = polygonEvent[i].shiftKey;
      break;
    }
  }
  // Rest of the code
}

1

如果有人仍在寻找如何从Google地图事件获取MouseEvent,这是我一直在使用的方法。

const mouseEvent = Object.values(event).find(p => p instanceof window.MouseEvent);
// then do whatever with the MouseEvent
const shiftKey = mouseEvent.shiftKey;

1
I've just come across this problem (after noticing I couldn't just use window.event because Firefox doesn't support it) google.maps.mouseEvent 有一个属性,其中包含诸如 shiftKeyaltKey 等键。在当前版本的 Google 地图 API 中,该属性为 va。因此,我们无法使用它,因为它的名称将在下一个版本中更改。
因此,我的解决方案是迭代 google.maps.mouseEvent 参数,检查其值,以查看哪个值是有效的 window.MouseEvent
var newcircle= new google.maps.Circle({map:map, position:map.getCenter(), radius:1000});

google.maps.event.addListener(newcircle,'click',function(mouseEvent) { 
    var event = Object.values(mouseEvent)
        .filter(function (property) {
          return property instanceof window.MouseEvent;
        });

    if (event.length) {
      event = event[0];
    } else {
      event = {};
    }
    var shiftKey = event.shiftKey || false;
});

有趣的是,当我尝试在此示例中使用标记时,google.maps.mouseEvent 中没有 window.MouseEvent 的实例。

是的,看起来对于标记(Markers)而言,该属性未被填充。如果您逐步查看源代码,您会发现Google Maps库创建了一个新的MouseEvent,并省略了同时发送原始事件的操作。 - Tspoon

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