簡體   English   中英

在谷歌地圖v3多邊形上檢測shift事件的鼠標事件

[英]Detect shiftKey for mouse event on google maps v3 polygon

使用Google Maps V3(.16)javascript API時,是否有辦法檢測到多邊形上的shift-mouseclick? https://developers.google.com/maps/documentation/javascript/reference#MouseEvent

我也收到了鼠標事件,我可以看到原始事件被包裹在一個谷歌事件類,這就是我們所需要的(訪問事件。Ua的 .shiftKey屬性)。

但是,我發現上個月Google可能已經更新了他們的api,現在該屬性已重命名為event。 Pa .shiftKey。

作為參考,請參閱http://i.stack.imgur.com/80npD.png ,以獲取webinspector中事件結構的屏幕截圖。 有什么方法可以檢測在使用事件單擊google maps多邊形期間是否按下了Shift鍵,而不必依賴google-not-updating-their-api? 我想念什么?

謝謝!

使用未記錄的屬性幾乎總是一個壞主意。 如果你能可能避免它,避免它。 在這種情況下,API可能已使用Closure Compiler進行了壓縮,因此,下次更新時,也可能不再是Pa

有什么方法可以檢測在使用事件單擊google maps多邊形期間是否按下了Shift鍵,而不必依賴google-not-updating-their-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
}

旁注: Object.keys是所有現代瀏覽器中都具有的ES5功能。 如果您需要支持IE8等較舊的瀏覽器,可以將其填充。

最后我得到了一個接近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
}

我剛遇到這個問題(注意到我不能只使用window.event,因為Firefox不支持它)

正如TJ Crowder所說, google.maps.mouseEvent具有一個包含諸如shiftKeyaltKey等鍵的屬性。在當前版本的google maps api中,該屬性為va 因此,我們當然不能使用它,因為它的名稱將在so的下一個版本中更改。

因此,我的解決方案是遍歷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的實例。

如果有人還在尋找如何從Google Maps事件獲取MouseEvent的方法,這就是我一直使用的方法。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM