使标记可拖动和可点击

发布于 2024-11-28 05:02:22 字数 907 浏览 1 评论 0原文

我有一个矢量图层,用于将标记显示为地图上的要素,但现在我所做的,它们是可拖动或可单击的。我该怎么做才能同时获得两者?

/*** Init Drag Marker
*/
    var dragFeature = new OpenLayers.Control.DragFeature(layerTrackMarker, 
        {'onComplete': updateMarker}
    );
    map.addControl(dragFeature);
    dragFeature.activate();

/*** Init Click Marker
*/
    var clickFeature = new OpenLayers.Control.SelectFeature(layerTrackMarker,
        {}
    );
    map.addControl(clickFeature);
    layerTrackMarker.events.on({
                    "featureselected": function(e) {
                        var markerId = e.feature.geometry.id;
                        removeMarker(markerId);
                        /* ToDo: show context menu */
                    },
                    "featureunselected": function(e) {
                        /* ToDo: hide context menu */
                    }
                });
    clickFeature.activate();

I have a vector-layer for displaying markers as features on my map, but now mather, what I do, they are eighter draggable or clickable. What can I do to get both?

/*** Init Drag Marker
*/
    var dragFeature = new OpenLayers.Control.DragFeature(layerTrackMarker, 
        {'onComplete': updateMarker}
    );
    map.addControl(dragFeature);
    dragFeature.activate();

/*** Init Click Marker
*/
    var clickFeature = new OpenLayers.Control.SelectFeature(layerTrackMarker,
        {}
    );
    map.addControl(clickFeature);
    layerTrackMarker.events.on({
                    "featureselected": function(e) {
                        var markerId = e.feature.geometry.id;
                        removeMarker(markerId);
                        /* ToDo: show context menu */
                    },
                    "featureunselected": function(e) {
                        /* ToDo: hide context menu */
                    }
                });
    clickFeature.activate();

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

晨敛清荷 2024-12-05 05:02:22

我没有测试过,但是这样的东西行不通吗?

var dragged = false;
var dragFeature = new OpenLayers.Control.DragFeature(layerTrackMarker, {
    onComplete: function(){
        if(dragged){
            dragCallback();
        }else{
            clickCallback();
        }
    },
    onStart: function(){
        dragged = false;
    },
    onDrag: function(){
        dragged = true;
    }
});
map.addControl(dragFeature);
dragFeature.activate();

编辑:如果没有实际拖动,则 onComplete 不会触发。这是jsFiddle的工作代码

var dragged = false;
var dragFeature = new OpenLayers.Control.DragFeature(pointLayer, {
    onStart: function(){dragged = false;},
    onDrag: function() {dragged = true;}
});

map.addControl(dragFeature);
dragFeature.activate();

map.events.register("mouseup", map , function(e){
    if(dragged == true){
        alert("dragged");
    }else{
        alert("clicked");
    }
});

http://jsfiddle.net/reKRr/5/

编辑:这是不那么老套的做法

var selectFeature = new OpenLayers.Control.SelectFeature(
    pointLayer,
    {
        onSelect: function(){            
            alert("selected");
        }
    }
);

var dragFeature = new OpenLayers.Control.DragFeature(pointLayer, {
    onComplete: function(){
        alert("drag");
    }
});

dragFeature.handlers['drag'].stopDown = false; 
dragFeature.handlers['drag'].stopUp = false; 
dragFeature.handlers['drag'].stopClick = false; 
dragFeature.handlers['feature'].stopDown = false; 
dragFeature.handlers['feature'].stopUp = false; 
dragFeature.handlers['feature'].stopClick = false; 

map.addControls([selectFeature,dragFeature]);

selectFeature.activate();
dragFeature.activate();

I didn't test it, but wouldn't something like this work?

var dragged = false;
var dragFeature = new OpenLayers.Control.DragFeature(layerTrackMarker, {
    onComplete: function(){
        if(dragged){
            dragCallback();
        }else{
            clickCallback();
        }
    },
    onStart: function(){
        dragged = false;
    },
    onDrag: function(){
        dragged = true;
    }
});
map.addControl(dragFeature);
dragFeature.activate();

Edit: onComplete doesn't fire if there was no actual drag. Here's the working code

var dragged = false;
var dragFeature = new OpenLayers.Control.DragFeature(pointLayer, {
    onStart: function(){dragged = false;},
    onDrag: function() {dragged = true;}
});

map.addControl(dragFeature);
dragFeature.activate();

map.events.register("mouseup", map , function(e){
    if(dragged == true){
        alert("dragged");
    }else{
        alert("clicked");
    }
});

jsFiddle: http://jsfiddle.net/reKRr/5/

EDIT: this is the less hacky way of doing it

var selectFeature = new OpenLayers.Control.SelectFeature(
    pointLayer,
    {
        onSelect: function(){            
            alert("selected");
        }
    }
);

var dragFeature = new OpenLayers.Control.DragFeature(pointLayer, {
    onComplete: function(){
        alert("drag");
    }
});

dragFeature.handlers['drag'].stopDown = false; 
dragFeature.handlers['drag'].stopUp = false; 
dragFeature.handlers['drag'].stopClick = false; 
dragFeature.handlers['feature'].stopDown = false; 
dragFeature.handlers['feature'].stopUp = false; 
dragFeature.handlers['feature'].stopClick = false; 

map.addControls([selectFeature,dragFeature]);

selectFeature.activate();
dragFeature.activate();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文