Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript OpenLayers6检测光标何时离开地图_Javascript_Openlayers 6 - Fatal编程技术网

Javascript OpenLayers6检测光标何时离开地图

Javascript OpenLayers6检测光标何时离开地图,javascript,openlayers-6,Javascript,Openlayers 6,我想隐藏光标离开地图时附着到光标的圆。当光标进入ol.control时,此圆圈也必须隐藏。 在较旧的OL版本中,我只是简单地将一个mouseleave侦听器添加到canvas对象中,但在OL6中,不能保证画布存在,并且对于OL viewport下面的所有元素,这些基本事件的传播似乎都会停止 如何在OL6中实现此行为?控件需要单独的侦听器。我的上下文菜单代码(在控件上不活动)如下所示 var controlOver = false; function setControlOver(element

我想隐藏光标离开地图时附着到光标的圆。当光标进入
ol.control
时,此圆圈也必须隐藏。 在较旧的OL版本中,我只是简单地将一个
mouseleave
侦听器添加到
canvas
对象中,但在OL6中,不能保证画布存在,并且对于
OL viewport
下面的所有元素,这些基本事件的传播似乎都会停止


如何在OL6中实现此行为?

控件需要单独的侦听器。我的上下文菜单代码(在控件上不活动)如下所示

var controlOver = false;

function setControlOver(element) {
    element.addEventListener('mouseover', function() { controlOver = true; });
    element.addEventListener('mouseout', function() { controlOver = false; });
}

setTimeout(function() {
    var controls = map.getViewport().getElementsByClassName('ol-control');
    for (var i=0; i<controls.length; i++) {
        setControlOver(controls[i]);
    }
    map.getControls().on('add', function(e) {
        // ????? setControlOver(e.element.getElement());
    });
}, 250);

map.getOverlays().on('add', function(e) {
    setControlOver(e.element.getElement());
});

var canvas = map.getViewport().getElementsByClassName('ol-overlaycontainer-stopevent')[0];

canvas.addEventListener('contextmenu', function (e) {
    if (!controlOver) {
        e.preventDefault();
        openContextMenu(e.x, e.y);
    }
});
var controlOver=false;
函数setControlOver(元素){
addEventListener('mouseover',function(){controlOver=true;});
addEventListener('mouseout',function(){controlOver=false;});
}
setTimeout(函数(){
var controls=map.getViewport().getElementsByClassName('ol-control');

对于(var i=0;i在侦听contextmenu事件时,我将画布替换为
map.getViewport().getElementsByClassName('ol-OverlyContainer-stopevent')[0]
,但是在您的情况下,使用
map.on('pointermove',…)可能更容易一些
并检查
event.pixel
是否位于地图边缘。但这样,我无法通过悬停ol.control来检测光标是否离开。谢谢您的回答。随着时间的推移,添加或删除控件时,这会变得更加复杂。自OL6以来的另一个问题是,我在ol视口下的元素上没有任何事件。我有一个类似的问题覆盖有问题,但为了简单起见,这里没有包括。我在集合更新时添加了新的侦听器,该代码现在在示例中。您可能可以执行类似于新控件的操作,但我不确定如何获取独立控件的元素。