Openlayers + Vue 实现自定义鼠标右键为改变视图角度事件

效果:

持续按下鼠标右键再拖动鼠标可以实现变换视图的角度

(openlayers的样式被我改了一下,看上去有点像ArcGIS API for JS 4.x的样式)

关键点
Vue里面如何阻止浏览器的默认右键事件
如何阻止openlayers自带的鼠标点击拖动地图事件
1.Vue里面如何阻止浏览器的默认右键事件
这里有一个坑,下面的代码是无效的,不能阻止浏览器的默认右键事件

html:

<div id="map"
     class="w-100"
     @mousedown.prevent.right.prevent="changeRotation('down',$event)"
     @mousemove="changeRotation('move',$event)"
     @mouseup.prevent.right.prevent="changeRotation('up',$event)"></div>
JavaScript:

//methods中
...
changeRotation:function(type,event){
    event.preventDefault();
    event.stopPropagation();
    ......
},
...
.prevent修饰符对mousedown和mouseup是无效的

正确的办法是:

只需要在html上增加: @contextmenu.prevent=""

<div id="map"
     class="w-100"
     @contextmenu.prevent=""
     @mousedown.right="changeRotation('down',$event)"
     @mousemove="changeRotation('move',$event)"
     @mouseup.right="changeRotation('up',$event)"></div>
不需要在methods添加代码

2.如何阻止openlayers自带的鼠标点击拖动地图事件
这里要在用户按住右键和按住右键移动鼠标时禁止拖动地图事件,松开后恢复点击拖动地图事件(openlayers自带的点击事件是不区分鼠标左右键的)

这个changeRotation的具体代码:

// 改变视图方向
        changeRotation:function(type,event){            
            // 点击默认的移动地图事件
            let pan=null; 
            this.map.getInteractions().forEach(function(element, index, array) { 
                if(element instanceof ol.interaction.DragPan) { 
                    pan = element; 
                } 
            });
            // 右键按下
            if (type==="down") {
                this.activeMouseRight=true;
                // 禁用地图拖动事件
                pan.setActive(false);
            }
            else if (type==="move") {
                // 首先判断右键是否被按下
                if (this.activeMouseRight) {
                    /*
                    * 计算角度
                    */
                    let mapCenter={
                            x:$("#map").width()/2+$("#map").offset().left,
                            y:$("#map").height()/2+$("#map").offset().top,
                        },
                        clickPoint={
                            x:event.screenX,
                            y:event.screenY,
                        };
                    let radian=Math.atan((clickPoint.y-mapCenter.y)/(clickPoint.x-mapCenter.x));
                    if (radian<Math.PI*0.5&&radian>Math.PI*-0.5) {
                       // 设置角度
                        this.map.getView().setRotation(radian); 
                    }
                }
            }
            // 右键松开
            else if (type==="up") {
                this.activeMouseRight=false;
                // 启用地图拖动事件
                pan.setActive(true);
            }
        },
这里将openlayers中的ol.Map类绑定成了Vue对象的一个属性

html:

<div id="map"
      class="w-100"
      @contextmenu.prevent=""
      @mousedown.right="changeRotation('down',$event)"
      @mousemove="changeRotation('move',$event)"
      @mouseup.right="changeRotation('up',$event)"></div>

原文链接:https://blog.csdn.net/DSH964/article/details/86010177

Openlayers + Vue 实现自定义鼠标右键为改变视图角度事件相关推荐

  1. 稳扎稳打Silverlight(29) - 2.0Tip/Trick之Cookie, 自定义字体, 为程序传递参数, 自定义鼠标右键...

    [索引页] [源码下载] 稳扎稳打Silverlight(29) - 2.0Tip/Trick之Cookie, 自定义字体, 为程序传递参数, 自定义鼠标右键, 程序常用配置参数 作者:webabcd ...

  2. Flex自定义鼠标右键

    这里写了一个简单的自定义鼠标右键,代码不难,请看注释   其它的请大家参看官方文档  ContextMenu类 ContextMenuItem类     源码: <?xml version=&q ...

  3. 如何在canvas画布上自定义鼠标右键菜单内容?

    用户大大提了一个需求,想要在画布上能够右键快捷点击使用某个功能,小菜鸟肯定要满足啊(委屈脸),然后靠着强大的各路神仙,写下了如下代码,终于实现了,为自己放个烟花~~~不喜勿喷哦~ 1.自定义鼠标右键菜 ...

  4. 自定义鼠标右键弹出式菜单

    <html>     <head>         <meta http-equiv="Content-Type" content="tex ...

  5. JQuery模拟网页中自定义鼠标右键菜单

    题外话.......最近在开发一个网站项目的时候,需要用到网页自定义右键菜单,在网上看了各路前辈大神的操作,头晕目眩,为了达到目的,突然灵机一动,于是便有了这篇文章. 先放个效果图(沾沾自喜,大神勿喷 ...

  6. html自定义鼠标右键,js自定义鼠标右键的实现原理及源码

    今天来记录下js来自定义鼠标右键,同样先来分解下它的实现原理: 1.屏蔽右键默认事件:(一度我以为修改的就是默认事件) 2.对一个ul的隐藏:(这个我也曾迂腐的认为值得这样操作的都是div,汗) 3. ...

  7. win10自定义鼠标右键多级菜单(包含桌面)

    --------------如果觉得博主写的可以,请关注博主-------------- 首先 win + r   输入 regedit 进去注册表 然后 # HKEY_CLASSES_ROOT\*\ ...

  8. vue项目禁用鼠标右键

    <template><div class="m-video-player-wrap" @contextmenu="handleMouse"&g ...

  9. 前端自定义网页鼠标右键菜单

    //监听全局上下文菜单 document.addEventListener('contextmenu', function(e){//阻止默认e.preventDefault()//自定义鼠标右键菜单 ...

最新文章

  1. Lync server 2013 监控角色的安装
  2. mfc 饼图绘画_绘画技能干货 | 【人体头颈】的绘画技巧(三)(内含母亲节抽奖公布)...
  3. Makefile (二)
  4. 【Python学习】 - Pandas学习 sort_value( ),sort_index( )排序函数的区别与使用
  5. Java 遍历系统根目录
  6. ServiceManager
  7. oracle 10g SQL* Plus主机字符串
  8. Linux文件系统Ext2,Ext3,Ext4性能大比拼
  9. 方方格子补丁_方方格子wps版下载 方方格子Excel工具箱插件(WPS版全套) v3.2.8.0 中文官方安装版 下载-脚本之家...
  10. Flex和Flash开发人员的Adobe Flash Player( Windows )调试器( 也称为调试播放器或内容调试器 )和独立播放器( 又名投影仪 )
  11. 行人重识别论文阅读11-BDTR 红外光行人重识别
  12. 两台电脑之间实现串口通信
  13. Promise详尽指南
  14. Ubuntu16.04 1660ti显卡驱动安装
  15. CS224n 深度自然语言处理(四) Note - Backpropagation and computation graphs
  16. 12.20-12.21北大医药
  17. 程序猿小白应该注意什么 1
  18. 90后创业者自述:不性感没逼格不能活
  19. 虚拟专用网的工作原理
  20. Android 基础四五六之:四大组件详解

热门文章

  1. 电火花线切割加工的步骤及要求
  2. 什么是软负载和硬负载?
  3. excel中按条件合并字符串
  4. 金门——《309暗室》之一
  5. 【Linux】Linux系统编程(入门与系统编程)(二)(vim、gcc、gdb、Makefile、yum、git等工具的了解与使用)
  6. maven plugin configuration
  7. 标注工具 labelme安装及使用 Win10
  8. 前端女娲补天 HTML(二)什么是懒加载,什么是预加载
  9. DuplicateHandle 伪句柄 与 实句柄的应用
  10. 基于Docker部署Wizard文档管理系统