|
本帖最后由 gaiyi 于 2019-6-13 14:18 编辑
最近在项目中开发了一个百度地图js版,之后遇到了在华为手机上监听点击事件失效的问题,其他手机暂未发现,在简书上找到了相关答案,感谢作者“没有昵称了吗”。。。把代码分享给大家。
原理:
通过监听touchstart和touchmove两个事件中,x1,y1和x2,y2的差值(绝对),如果大于10px那么认为是拖动,否则认为是点击。
修改后的代码如下,供参考:
- Model.prototype.loadBaiduMap = function(city_name, county_name) {
- var id = this.getIDByXID("baiduMap");
- var self = this;
- window._baiduInit = function() {
- map = new BMap.Map(id);
- // map.centerAndZoom(new BMap.Point(121.397428, 31.90923), 12);
- // map.addControl(new BMap.MapTypeControl());
- // map.setCurrentCity("北京");
- // map.enableScrollWheelZoom("true");
- var geolocation = new BMap.Geolocation();
- geolocation.getCurrentPosition(function(r) {
- if (this.getStatus() == BMAP_STATUS_SUCCESS) {
- if (self.latitude && self.longitude) {
- self.isLocation = "1";
- var point = new BMap.Point(self.longitude, self.latitude);
- map.centerAndZoom(point, 11);
- map.panTo(point);
- map.addOverlay(new BMap.Marker(point));
- self.setAddressData(point);
- } else {
- self.isLocation = "";
- map.centerAndZoom(r.address.city, 11);
- map.panTo(r.point);
- }
- } else {
- alert('failed' + this.getStatus());
- }
- }, {
- enableHighAccuracy : true
- })
- // 添加带有定位的导航控件
- var top_right_navigation = new BMap.NavigationControl({
- anchor : BMAP_ANCHOR_BOTTOM_LEFT,
- type : BMAP_NAVIGATION_CONTROL_SMALL
- // BMAP_NAVIGATION_CONTROL_SMALL:仅包含平移和缩放按钮;BMAP_NAVIGATION_CONTROL_PAN:仅包含平移按钮;BMAP_NAVIGATION_CONTROL_ZOOM:仅包含缩放按钮
- });
- map.addControl(top_right_navigation);
- var p = {
- x1 : 0,
- y1 : 0,
- x2 : 0,
- y2 : 0
- };
- map.addEventListener('touchstart', function(evt) {
- // console.log('X:', evt.touches[0].clientX)
- p.x1 = p.x2 = evt.touches[0].clientX;
- // console.log('Y:', evt.touches[0].clientY)
- p.y1 = p.y2 = evt.touches[0].clientY;
- })
- map.addEventListener('touchmove', function(evt) {
- // console.log('X:', evt.touches[0].clientX)
- p.x2 = evt.touches[0].clientX;
- // console.log('Y:', evt.touches[0].clientY)
- p.y2 = evt.touches[0].clientY;
- })
- map.addEventListener('touchend', function(e) {
- // 如果x轴或者y轴移动超过10px,那么认为是拖动,而不是点击(touch),使用绝对值保证左右上下移动都可以计算正确
- if (Math.abs(p.x1 - p.x2) < 10 || Math.abs(p.y1 - p.y2) < 10) {
- // alert('点击了地图')
- // console.log(p);
- map.clearOverlays();
- map.addOverlay(new BMap.Marker(new BMap.Point(e.point.lng, e.point.lat))); // 增加点
- self.isLocation = "";
- self.setAddressData(e.point);
- } else {
- // alert('拖动了地图')
- // console.log(p);
- }
- })
- // 增加点击事件
- // map.addEventListener("click", function(e) {// 该事件在部分华为手机上失效,其他手机暂未发现,解决方案是监听touch事件
- // console.log("点击事件");
- // map.clearOverlays();
- // map.addOverlay(new BMap.Marker(new BMap.Point(e.point.lng, e.point.lat))); // 增加点
- // self.isLocation = "";
- // self.setAddressData(e.point);
- // });
- };
- require([ 'https://api.map.baidu.com/api?v=3.0&ak=你的ak&callback=_baiduInit' ], function() {
- if (!(window.BMap && window.BMap.apiLoad)) {
- window._baiduInit();
- }
- });
- };
复制代码
|
|