博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
百度地图手机端单触点单击和长按事件,解决部分手机(小米手机)地图单击事件失效,多触点、拖动依然触发长按的bug...
阅读量:4692 次
发布时间:2019-06-09

本文共 10970 字,大约阅读时间需要 36 分钟。

/**  * Author 岳晓  *   * 对百度地图的事件扩展,目前扩展了fastclick和longclick,  * 解决某些设备click不执行的问题  * 解决长按事件在拖动、多触点依然执行的bug  * v1.0.0  */    (function(){      BMap.Map.prototype.on=function(evt,fn,option){          var _option = {              canBubble:true          }                    extend(_option,option)                    if(!evt || !fn) return;                              var $this = this;          var evtList = ["longtouch","onetouch"];          if(inArray(evt,evtList)){              MesureEvents[evt]($this,evt,fn,option);              $this.getContainer().querySelector("div.BMap_mask").addEventListener(evt,fn);          }          else{              $this.addEventListener(evt,fn);              /*function(e){                 if(option.canBubble){                     e.domEvent.stopPropagation();                 }                 fn.call(this,e);             });*/          }      };            var centerAndZoom = BMap.Map.prototype.centerAndZoom;            BMap.Map.prototype.centerAndZoom  = function(){                    var $this = this;          centerAndZoom.apply(this,arguments);          if(!$this.hasRegistMyTouch){              $this.on("onetouch",function(e){                  //console.log(e);                  var event = document.createEvent("MouseEvent");                  event.initEvent("fastclick",true,true);                                                                        event.clientX = e.clientX;                  event.clientY = e.clientY;                  event.point = e.point;                  $this.dispatchEvent(event);                                    var event = document.createEvent("MouseEvent");                  event.initEvent("click",true,true);                  event.clientX = e.clientX;                  event.clientY = e.clientY;                  $this.dispatchEvent(event);              });              $this.on("longtouch",function(e){                  //console.log(e);                  var event = document.createEvent("TouchEvent");                  event.initEvent("longclick",true,true);                  event.clientX = e.clientX;                  event.clientY = e.clientY;                  event.point = e.point;                  $this.dispatchEvent(event);              });              $this.hasRegistMyTouch = true;          }                }      var MesureEvents = {          onetouch:function($this,evt,fn,data,option){              var ismoved;              var time = null;              var touchLocation = null;              var maxTouchesCount = 0;                            var container = $this.getContainer();              var mask = container.querySelector("div.BMap_mask");              var panes = $this.getPanes();                            $this.addEventListener("touchstart",function(e){                                    var temp = Math.max(maxTouchesCount,e.touches.length);                  if(temp==1) {                      var touch = e.changedTouches[0];                                            if(isAncestors(touch.target,[panes.floatPane,panes.markerMouseTarget,panes.markerPane],container)) return;                                            maxTouchesCount = temp;                                            touchLocation = {                          x:touch.clientX,                          y:touch.clientY                      };                      time = new Date().getTime();                  }              });              $this.addEventListener("touchmove",function(e){                  maxTouchesCount = Math.max(maxTouchesCount,e.touches.length);                                    if(maxTouchesCount==1) {                      var touch = e.changedTouches[0];                                            if(isAncestors(touch.target,[panes.floatPane,panes.markerMouseTarget,panes.markerPane],container)) return;                                                                  if(Math.abs(touchLocation.x-touch.clientX)>0 && Math.abs(touchLocation.y-touch.clientY)>0){
//解决部分手机对touchmove过分“敏感”的问题 ismoved = true; //console.log("touchmove---"); } else{ ismoved = false; } } }); $this.addEventListener("touchend",function(e){ var touches =e.touches.length; if(touches==0){ var touch = e.changedTouches[0]; if(isAncestors(touch.target,[panes.floatPane,panes.markerMouseTarget,panes.markerPane],container)) return; var temp = maxTouchesCount; var tempM = ismoved; ismoved= false; maxTouchesCount = 0; if(temp==1 && !tempM /*&& /BMap_mask/.test(e.srcElement.className)*/ && new Date().getTime()-time<500){ var event = document.createEvent("Event"); event.initEvent("onetouch",true,true); var touch = e.changedTouches[0]; event.clientX = touch.clientX; event.clientY = touch.clientY; event.point =calLngLat($this,event.clientX,event.clientY); mask.dispatchEvent(event,fn); } } }); }, longtouch:function($this,evt,fn,data,option){ var ismoved; var time = null; var timeout; var maxTouchesCount = 0; var touchLocation = null; var container = $this.getContainer(); var mask = container.querySelector("div.BMap_mask"); var panes = $this.getPanes(); $this.addEventListener("touchstart",function(e){ var temp = Math.max(maxTouchesCount,e.touches.length); if(temp==1) { var touch = e.changedTouches[0]; if(isAncestors(touch.target,[panes.floatPane,panes.markerMouseTarget,panes.markerPane],container)) return; maxTouchesCount = temp; touchLocation = { x:touch.clientX, y:touch.clientY }; time = new Date().getTime(); timeout = setTimeout(function(){ clearTimeout(timeout); timeout = null; longtouch(e); },750); } }); $this.addEventListener("touchmove",function(e){ maxTouchesCount = Math.max(maxTouchesCount,e.touches.length); if(maxTouchesCount==1) { var touch = e.changedTouches[0]; if(isAncestors(touch.target,[panes.floatPane,panes.markerMouseTarget,panes.markerPane],container)) return; //console.log("move:" +touch.clientX +"," + touch.clientY); if(Math.abs(touchLocation.x-touch.clientX)>=2 && Math.abs(touchLocation.y-touch.clientY)>2){
//解决部分手机对touchmove过分“敏感”的问题 ismoved = true; //console.log("touchmove---"); if(timeout){ clearTimeout(timeout); timeout = null; } } else{ ismoved = false; } } else{ if(timeout){ clearTimeout(timeout); timeout = null; } } }); function longtouch(e){ var temp = maxTouchesCount; var tempM = ismoved; ismoved= false; maxTouchesCount = 0; if(temp==1 && !tempM){ var event = document.createEvent("Event"); event.initEvent("longtouch",true,true); var touch = e.changedTouches[0]; event.clientX = touch.clientX; event.clientY = touch.clientY; event.point =calLngLat($this,event.clientX,event.clientY); $this.getContainer().querySelector("div.BMap_mask").dispatchEvent(event); } } $this.addEventListener("touchend",function(e){ var touches =e.touches.length; if(touches==0){ var touch = e.changedTouches[0]; if(isAncestors(touch.target,[panes.floatPane,panes.markerMouseTarget,panes.markerPane],container)) return; maxTouchesCount = 0; ismoved= false; } if(new Date().getTime()-time<1000){ if(timeout){ clearTimeout(timeout); timeout = null; } } }); } } function calLngLat($this,x,y){ var container = $this.getContainer(); var rect = container.getBoundingClientRect(); var y = y - rect.top; var x = x - rect.left; var bounds = $this.getBounds(); var lefTop = new BMap.Point(bounds.getSouthWest().lng,bounds.getNorthEast().lat); var lefTopPix = $this.pointToPixel(lefTop); var pix = new BMap.Pixel(lefTopPix.x + x,lefTopPix.y+y); var point = $this.pixelToPoint(pix); return point; } function inArray(obj,array){ for(x in array){ if(obj==array[x]) return true; } return false; } function extend(o1,o2){ if(o1 && o2){ for(x in o2){ if(o2.hasOwnProperty(x) && o2[x]!=undefined){ o1[x] = o2[x]; } } } } function isAncestors(element,nodes,root){ var p = element; while(p && p!=root){ if(inArray(p,nodes)){ return true; } p = p.parentElement; } return false; } })(BMap);

 

转载于:https://www.cnblogs.com/hnsongbiao/p/7746796.html

你可能感兴趣的文章
素数与欧拉函数
查看>>
(图)关于边信息的存储
查看>>
flask + Python3 实现的的API自动化测试平台---- IAPTest接口测试平台(总结感悟篇)...
查看>>
知识点列表
查看>>
JavaSE 基础语法—三元运算符
查看>>
快速导入Excel数据到mysql
查看>>
编程之美,让美国人科技高速发展,浅谈C语言带给美国的变化
查看>>
Error querying database. Cause: java.lang.IllegalArgumentException:Failed to decrypt.(错误笔记)...
查看>>
关于Flutter
查看>>
实现页面图片阴影特效,jsp,asp,sql,php,mysql,server,apache,iis,tomcat,oracle,java,linux,dns
查看>>
jdbc、DBUtils
查看>>
一个关于vue+mysql+express的全栈项目(四)------ sequelize中部分解释
查看>>
数据库服务器监控取不到值
查看>>
Major Performance Impacts
查看>>
监督学习--k近邻算法
查看>>
Python 进程与线程
查看>>
【3-31】操作属性、元素、内容及定时器
查看>>
统计局的五级(省市区乡村)数据库支持 MS SQL SERVER 2005 和 MS SQL SERVER 2008
查看>>
软件测试
查看>>
[整理]在命令行执行 UIAutomation
查看>>