Javascript 按下shift键时谷歌地图改变点击行为

Javascript 按下shift键时谷歌地图改变点击行为,javascript,google-maps,google-maps-api-3,Javascript,Google Maps,Google Maps Api 3,我试图让JS动作发生在谷歌地图上,当按住shift键时,这些动作会有所不同。内置的click事件不提供键修饰符,因此您无法从该事件中做出决策 但您可以添加一个本机DOM侦听器,并在那里进行检查: google.maps.event.addDomListener(document.getElementById("map"), 'click', function(event) { if (event.shiftKey) { // do something with x, y

我试图让JS动作发生在谷歌地图上,当按住shift键时,这些动作会有所不同。内置的click事件不提供键修饰符,因此您无法从该事件中做出决策

但您可以添加一个本机DOM侦听器,并在那里进行检查:

google.maps.event.addDomListener(document.getElementById("map"), 'click', function(event) {
    if (event.shiftKey) {
        // do something with x, y e.g. use an overlay to find latLng
    } 
    else {
        // do something else
    }
});
(改编自)

但是,我仍然希望在适当的场景中触发正常单击事件,例如,在地图的正常区域上单击时,而不是在标记上单击时

    map.addListener( 'click', function(e) {
        // normal map click
    });
但是,这个click事件在本机DOM事件之前触发,因此我看不到在本机事件中做出决策的任何方法,但仍然保持标准click的行为


我错过什么了吗?例如,有没有一种方法可以使DOM事件在内置的click事件之前触发?

也许这是显而易见的,但我解决这个问题的方法是在普通的click事件中设置一个全局变量,然后在DOM click事件中检查正在设置的变量

这样,如果正常的click事件触发的环境是正确的,那么如果shift键没有按下,则在DOM事件中设置变量并执行click

如果shift键按下,我们将执行其他操作

无论哪种方式,我们都会清除变量

var mapClickFired = false;

map.addListener( "click", function(e) {
    mapClickFired = true; // acted on in DOM listener below
});

// bind to DOM event as well, so we can find out if modifier keys are pressed
google.maps.event.addDomListener( document.getElementById("map"), "click", function(event) {
    // check modifiers
    if ( event.shiftKey ) {
        // do things for shift key down
    }
    else if ( mapClickFired ) {
        // do things for regular map click 
    }
    mapClickFired = false;
});
var keydn = "";
function keyEventDn(event) {
    keydn = ""
    if (event.ctrlKey){keydn = "ctrlkey"};
    if (event.shiftKey) {keydn = "shiftkey"};
    if (event.altKey) {keydn = "altkey"};
}

当然,这确实取决于这两个事件的顺序是否与预期一致。由于没有文档记录,我有点紧张,我创建了一些脆弱的东西。

也许这很明显,但我解决了这个问题,只需在普通单击事件中设置一个全局变量,然后在DOM单击事件中检查所设置的变量

这样,如果正常的click事件触发的环境是正确的,那么如果shift键没有按下,则在DOM事件中设置变量并执行click

如果shift键按下,我们将执行其他操作

无论哪种方式,我们都会清除变量

var mapClickFired = false;

map.addListener( "click", function(e) {
    mapClickFired = true; // acted on in DOM listener below
});

// bind to DOM event as well, so we can find out if modifier keys are pressed
google.maps.event.addDomListener( document.getElementById("map"), "click", function(event) {
    // check modifiers
    if ( event.shiftKey ) {
        // do things for shift key down
    }
    else if ( mapClickFired ) {
        // do things for regular map click 
    }
    mapClickFired = false;
});
var keydn = "";
function keyEventDn(event) {
    keydn = ""
    if (event.ctrlKey){keydn = "ctrlkey"};
    if (event.shiftKey) {keydn = "shiftkey"};
    if (event.altKey) {keydn = "altkey"};
}

当然,这确实取决于这两个事件的顺序是否与预期一致。由于没有文档记录,我有点紧张,我创建了一些脆弱的东西。

对于我来说,我通过捕获全局变量的全局关键事件消息解决了这个问题

var mapClickFired = false;

map.addListener( "click", function(e) {
    mapClickFired = true; // acted on in DOM listener below
});

// bind to DOM event as well, so we can find out if modifier keys are pressed
google.maps.event.addDomListener( document.getElementById("map"), "click", function(event) {
    // check modifiers
    if ( event.shiftKey ) {
        // do things for shift key down
    }
    else if ( mapClickFired ) {
        // do things for regular map click 
    }
    mapClickFired = false;
});
var keydn = "";
function keyEventDn(event) {
    keydn = ""
    if (event.ctrlKey){keydn = "ctrlkey"};
    if (event.shiftKey) {keydn = "shiftkey"};
    if (event.altKey) {keydn = "altkey"};
}
此函数可通过以下方式初始化:

<body onkeydown="keyEventDn(event)">

然后,您可以在需要的任何地方使用关键事件。不要忘记将变量重置回keydn=“”;如果您使用过它,或者在一些全局事件中使用过它,例如map、clicked或map、moved


如果有进一步改进的余地:-)。祝你好运,Reinhard对我来说,我通过捕获全局变量的全局关键事件消息解决了这个问题

var mapClickFired = false;

map.addListener( "click", function(e) {
    mapClickFired = true; // acted on in DOM listener below
});

// bind to DOM event as well, so we can find out if modifier keys are pressed
google.maps.event.addDomListener( document.getElementById("map"), "click", function(event) {
    // check modifiers
    if ( event.shiftKey ) {
        // do things for shift key down
    }
    else if ( mapClickFired ) {
        // do things for regular map click 
    }
    mapClickFired = false;
});
var keydn = "";
function keyEventDn(event) {
    keydn = ""
    if (event.ctrlKey){keydn = "ctrlkey"};
    if (event.shiftKey) {keydn = "shiftkey"};
    if (event.altKey) {keydn = "altkey"};
}
此函数可通过以下方式初始化:

<body onkeydown="keyEventDn(event)">

然后,您可以在需要的任何地方使用关键事件。不要忘记将变量重置回keydn=“”;如果您使用过它,或者在一些全局事件中使用过它,例如map、clicked或map、moved


如果有进一步改进的余地:-)。祝你好运,莱因哈德

如果“正常”点击不起作用,你想做什么?据我所知,所有映射“内置行为”都在继续工作(除非您正在采取措施阻止它们)。也许你可以提供一个例子来说明你的“问题”。顺便说一句,我也看到了一个一致的顺序,“谷歌地图”事件优先,“谷歌DOM”事件。正常的点击按预期工作,但即使我按下shift键,也会发生这种情况-我不想这样。感谢您确认您看到了相同的顺序-我想这是我问题的主要部分。我已经尝试再次澄清我的问题,谢谢。在“正常”点击不起作用时,您想做什么?据我所知,所有映射“内置行为”都在继续工作(除非您正在采取措施阻止它们)。也许你可以提供一个例子来说明你的“问题”。顺便说一句,我也看到了一个一致的顺序,“谷歌地图”事件优先,“谷歌DOM”事件。正常的点击按预期工作,但即使我按下shift键,也会发生这种情况-我不想这样。谢谢你确认你看到了相同的顺序-我想这是我问题的主要部分。我再次尝试澄清我的问题,谢谢。谢谢,这是我研究的一种方式。不幸的是,由于某种原因,它在嵌入应用程序的IE控件中不起作用,所以我无法使用它。嗯,我在本地basic的AutoIt GUI中使用嵌入式IE控件(“Shell.Explorer.2”)。接下来,我将检查您是否可以在GUI中捕获关键事件。如果是,并且html页面处于控制之下,则可以将“keyDn=ctrlkey”发送到js变量。祝你好运,ReinhardHi Reinhard,你能在嵌入式IE控件中处理shift/ctrl等键吗?我可以用非特殊键,如字母和数字,但不能用shift和ctrl键。当然很难说这些是在哪里被拦截的汉克斯,这是我调查的一种方式。不幸的是,由于某种原因,它在嵌入应用程序的IE控件中不起作用,所以我无法使用它。嗯,我在本地basic的AutoIt GUI中使用嵌入式IE控件(“Shell.Explorer.2”)。接下来,我将检查您是否可以在GUI中捕获关键事件。如果是,并且html页面处于控制之下,则可以将“keyDn=ctrlkey”发送到js变量。祝你好运,ReinhardHi Reinhard,你能在嵌入式IE控件中处理shift/ctrl等键吗?我可以用非特殊键,如字母和数字,但不能用shift和ctrl键。当然,很难说这些信息是在哪里被截获的