如何包装 ui 控件(mapbox 地理定位控件)

2024-03-30

我想扩展/更改具有某些功能的地图框地理定位控件,例如:

  1. 我想飞到而不是跳到当前位置
  2. 我想在打开地理控制按钮时添加一些行为(例如防止拖动)。

我怎么做?我尝试制作包装纸,但后来遇到了一些问题:

  • 按钮的颜色在打开时应变为蓝色,但确实如此 不再工作了
  • 我不知道如何为单击按钮添加功能。

我有一个fiddle https://jsbin.com/wesukut/edit?html,js,output展示我如何尝试制作包装纸。如您所见,flyTo 有效。

mapboxgl.accessToken = 'pk.eyJ1IjoidG1jdyIsImEiOiJIZmRUQjRBIn0.lRARalfaGHnPdRcc-7QZYQ'


var map = new mapboxgl.Map({
  container: 'map', // container id
  style: 'mapbox://styles/mapbox/streets-v9', //stylesheet location
  center: [-74.50, 40], // starting position
  zoom: 9 // starting zoom
})


class GeolocateControlWrapper extends mapboxgl.GeolocateControl {
  constructor() {
    super()
  }
  _onSuccess(position) {
    this._map.flyTo({
      center: [position.coords.longitude, position.coords.latitude],
      zoom: 17,
      bearing: 0,
      pitch: 0
    })

    this.fire('geolocate', position)
    this._finish()
  }
}

map.addControl(new GeolocateControlWrapper({
  positionOptions: {
    enableHighAccuracy: true,
    timeout: 300
  },
  watchPosition: true
}), 'top-left')

编辑、更新: 我对问题的第二部分仍然有疑问。我设法让“包装器”工作起来,看看this https://jsbin.com/matayut/edit?js,console,output。然而,在我的“现实生活”环境中,单击地理控制按钮时出现以下错误:

Uncaught TypeError: Cannot read property 'extend' of undefined
    at GeolocateControlWrapper._onClickGeolocate (eval at <anonymous> (0.b708727….js:485), <anonymous>:192:48)
_onClickGeolocate @ Maplayout.vue?f994:154
VM2654:1 Uncaught SyntaxError: Unexpected identifier

它引用了这一行:

mapboxgl.util.extend(defaultGeoPositionOptions, this.options && this.options.positionOptions || {})

知道为什么吗?

编辑、更新: 使用以下代码让它工作:

class GeolocateControlWrapper extends mapboxgl.GeolocateControl {
        _onSuccess (position) {
          this._map.flyTo({
            center: [position.coords.longitude, position.coords.latitude],
            zoom: 17,
            bearing: 0,
            pitch: 0
          })

          this.fire('geolocate', position)
          this._finish()
        }

        _setupUI (supported) {
          super._setupUI(supported)
          if (supported === false) return
          this._geolocateButton.className += ' needsclick'
        }

        _onClickGeolocate () {
          super._onClickGeolocate()
          // toggle watching the device location
          if (this.options.watchPosition) {
            if (this._geolocationWatchID !== undefined) { // clear watchPosition
              console.log('looks good in if....')
            }
            else {
              // enable watchPosition
              console.log('looks good in else....')
            }
          }
        }
      }

我从你的第一个问题开始:

  • 按钮的颜色在打开时应变为蓝色,但事实并非如此 不再工作了

颜色发生变化时options.watchPosition设置为 true 并且该按钮用作切换按钮。否则,单击按钮只会更新您在地图上的位置,但不会切换任何内容。 您设置了该选项,但构造函数不会将选项对象传递给其父类。因此,要么完全省略构造函数,要么传递选项:

class GeolocateControlWrapper extends mapboxgl.GeolocateControl {
  constructor(options) {
    super(options)
  }

现在回答你的第二个问题:

  • 我不知道如何为单击按钮添加功能。 我想在打开地理控制按钮时添加一些行为(例如防止拖动)。

切换watchPosition完成于_onClickGeolocate() https://github.com/mapbox/mapbox-gl-js/blob/b9e10b939c6a3fe5d7ecac209f751b4871970ede/src/ui/control/geolocate_control.js#L118。添加this._map.dragPan.disable() and this._map.dragPan.enable()应阻止/允许用户拖动地图。但我坐在电脑前,所以我没有测试地图在变化时是否仍然跟随你的位置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何包装 ui 控件(mapbox 地理定位控件) 的相关文章

  • 如何获取对象的所有属性?

    如何在 JavaScript 中使用反射获取对象的所有属性 循环遍历对象并获取属于该对象且不属于该对象的每个键 一个函数 var properties for var key in obj if obj hasOwnProperty key
  • 在 JavaScript 中生成 RSA 密钥对

    我最近发现了这个 RSA JavaScript 库 http www ohdave com rsa http www ohdave com rsa 但是 它要求预先生成密钥 这是我的问题 问题 我想在 JavaScript 中生成 RSA
  • 滚动时输入自动完成位置错误(chrome)

    我在输入文本的默认自动完成功能方面遇到了一些麻烦 滚动时它不会相应移动 我希望自动完成文本保留在输入的正下方 有办法做到这一点吗 我在 Chrome 浏览器版本 57 0 2987 133 中发生这种情况 fiddle https jsfi
  • 在 Javascript 中获取第一个数字出现后的子字符串

    我正在尝试提取第一个数字之后 并包括 的字符 ABC 123SD gt 123SD 123 gt 123 123SD gt 123SD ABC gt 我当前的解决方案如下 var string1 ABC 123SD var firstDig
  • 打开 md-calendar 时滚动到当前日期

    目前正在构建一个使用 Angular Material 的应用程序 我们需要一个 md calendar 组件 我们想要自定义按钮样式和内容 因此不使用普通的 md datepicker 问题是 当 md calender 打开时 滚动位置
  • 限制可选 DOM 复选框

    我试图限制用户可以选择的复选框数量 这些复选框是为数组中的每个项目生成的 DOM 输入对象 我目前对此没有运气 因此非常感谢任何帮助 谢谢 在这里小提琴 http jsfiddle net vVxM2 222 http jsfiddle n
  • 如何导入和导出 javascript ES6 类

    我是 javascript 和 nodejs 的新手 我正在使用这个项目来发展我的技能并学习新技术 目前我的项目使用多个相互依赖的类 类文件位于不同的目录中 我当前正在尝试使用 export 和 require 语句来允许在其他文件中引用类
  • 使用文件 API 将资源加载到 Three.js 中

    我想创建导入 3D 模型以在浏览器中查看的功能 方法是使用File API http www html5rocks com en tutorials file dndfiles Three js 加载器在我托管的文件上运行良好 我的理解是加
  • 使用 JavaScript 生成 PDF 文件

    我正在尝试将 XML 数据从网页转换为 PDF 文件 并且希望能够完全在 JavaScript 中完成此操作 我需要能够绘制文本 图像和简单的形状 我希望能够完全在浏览器中完成此操作 我刚刚写了一个名为jsPDF https github
  • 通过JS Laravel访问存储目录

    有没有办法访问storage目录 该目录已经链接到publicJS 中的目录 我正在尝试制作一个上传图片的表单 验证脚本 if request gt hasFile photos marker gt photos request gt ph
  • 有没有办法将变量从 javascript 导入到 sass 或反之亦然?

    我正在制作一个依赖于块概念的 CSS 网格系统 所以我有一个基本文件 例如 max columns 4 block width 220px block height 150px block margin 10px 它被 mixin 使用 m
  • 在 jQuery 可排序中对多个选定项目进行排序?

    我试图在 jQuery 可排序集中选择多个项目 然后将选定的项目一起移动 这是我的弱点开始尝试使其发挥作用 http jsfiddle net benstenson CgD8Y 这是代码 HTML div class container d
  • JavaScript 测验在提出所有问题之前结束

    我现在正在学习 JavaScript 并且正在创建一个测验 我的测验运行正常 控制台中没有任何错误 但它会跳过问题 有时会在回答所有问题之前结束测验 即使给出正确答案 也会减少时间 我不太确定为什么它会这样做 因为在我看来它的编码是正确的
  • 在 React Navigation 中将 props 传递给自定义抽屉导航器

    在反应导航抽屉菜单中 我想显示用户名 John Doe 它处于我的主要组件的状态 Router 我怎样才能将自定义抽屉内容组件传递给它 额外信息 我从 AsyncStorage 中获取此名称 组件已挂载 这是我的代码 export defa
  • 如何使用 vanilla JS 实现可维护的反应式 UI

    今天我遇到了一个问题 可以通过使用像 Vue 这样的反应式和状态管理框架来轻松解决 遗憾的是 无法使用它 以下 简化 情况 链接到代码笔 https codepen io theiaz pen BazErKV 我们有一个服务器渲染的页面 其
  • 使用日期字符串数组在引导日期选择器中设置禁用月份不起作用

    我有一个日期选择器 其配置如下 HTML div class input group date div
  • 如何处理requireJs超时错误?

    我正在使用 require js 作为加载框架编写一个移动混合应用程序 我遇到加载错误的问题 我想做的是在设备离线且无法下载在屏幕上显示地图所需的 google 地图 API 脚本时设置后备解决方案 我得到的只是 Uncaught Erro
  • 从 DirectionsRenderer 中获取折线或标记的事件

    我正在使用 DirectionsService 和路线方法来生成 DirectionsResult 我还使用 DirectionsRenderer 对象来显示结果 因为它非常易于使用 我在检测 Directions changed 事件时没
  • IE 中的每个 JavaScript 支持?

    我有这个代码
  • Node.js - 重载函数

    有没有一种方法可以重载node js中的函数 类似于 noSuchMethod https developer mozilla org en JavaScript Reference Global Objects Object noSuch

随机推荐

  • Java 8 流 - 超时?

    我想循环一个巨大的数组并执行一组需要很长时间的复杂指令 但是 如果超过 30 秒 我希望它放弃 ex final long start System currentTimeMillis myDataStructure stream whil
  • Swift 数字和 CGFloat(CGPoint、CGRect 等)

    我发现 Swift 数字特别笨拙 就像现实生活中经常发生的那样 我必须与 Cocoa Touch 就 CGRect 和 CGPoint 进行交流 例如 因为我们正在谈论某事frame or bounds CGFloat 与 Double 考
  • 尝试在 Maven 中构建具有嵌入式依赖项的 OSGi 包。似乎无法从 BND 类路径中排除传递依赖项

    基本上 我的 Web 服务必须可部署为单个 OSGi jar 包 所以 该包必须包含所有编译和运行时 Maven 依赖项 它还必须包含依赖于这些依赖项的所有非可选依赖项 即传递依赖项 我正在尝试使用 maven bundle plugin
  • 使用 java.util.TimeZone 查找 DST 转换时间戳

    是否可以使用 Java Calendar Date TimeZone API 获取上一个和下一个 DST 转换时间戳 With Joda Time我可以写 DateMidnight today new DateMidnight 2009 2
  • 无法在浏览器中显示希腊字母

    我正在使用 html 和 css 开发一个网站 但我看不到希腊字母 相反 我只看到符号 我的 html 文件中有以下行 我也尝试过
  • Backbone.js 控制器中的默认路由?

    我想为我的backbone js 控制器设置默认路由 目前我是这样做的 class DealSearchController extends Backbone Controller routes list showListView phot
  • 将 HSB/HSV 颜色转换为 HSL

    如何将 HSB 颜色转换为 HSL Photoshop 在其颜色选择器中显示 HSB 颜色 HSB 颜色不能在 CSS 中使用 但 HSL 可以 我尝试了这个JS function hsb2hsl h s b return h h s s
  • 如何创建 WPF 圆角容器?

    我们正在创建一个 XBAP 应用程序 我们需要在单个页面的各个位置具有圆角 并且我们希望有一个 WPF 圆角容器来在其中放置一堆其他元素 有人对我们如何最好地实现这一目标有一些建议或示例代码吗 是使用样式还是创建自定义控件 您不需要自定义控
  • 在 Groovy 中,为什么扩展 Comparable 的接口的“==”行为会发生变化?

    我正在尝试在 Groovy 中开发一个项目 我发现我的一些测试以一种奇怪的方式失败 我有一个界面Version extends Comparable
  • div 不会以 margin: 0 auto 居中;

    我的问题只是将 div 居中 目前 我只有一个简单的 html 文件 我不知道为什么margin 0 auto不工作 这是我的 html 的布局
  • 什么是最简单的 Tomcat/Apache 连接器 (Windows)?

    我在 Windows XP 机器上运行 apache 2 2 和 tomcat 5 5 哪个 tomcat apache 连接器最容易设置并且有详细的文档记录 mod proxy ajp http httpd apache org docs
  • 如何正确使用SyncManager.Lock或Event?

    我使用时遇到问题SyncManager Lock正确 我读了官方文档 https docs python org 3 library multiprocessing html multiprocessing managers SyncMan
  • 如何集中primefaces菜单栏?

    我需要集中 primefaces 菜单栏 我试过这个
  • 使用 Apache Ant 清理陈旧的 .class 文件

    怎样清理陈旧的东西 class文件出自 workdir 给定一组现有的 java文件在 srcdir 我所说的陈旧是指 class从现在开始生成的文件被删除 java文件 我尝试过使用 Ant 映射器和文件集等来想出一些东西 但失败了 删除
  • SlugRelatedField 查询集

    我正在努力找出 SlugRelatedField 的查询集 我的数据是这样的 我有一堆Object属于 a 的实例Project 一个项目有一个独特的 顶 Object Object仅当它们位于不同的下面时才可以具有相同的名称Project
  • 在 C# 中复制带有身份验证的文件

    我正在尝试将文件从本地驱动器复制到服务器上的文件夹之一 服务器上文件夹的名称是 DBFiles 除了用户名 user 和密码 password1 之外 没有人可以访问此内容 在复制文件之前 如果目录不存在 它也会创建该目录 有人可以帮助在创
  • 使用 Google Cloud PubSub 时不断收到“向 Cloud PubSub 发送测试消息时出错...”

    我正在尝试将 Google 的推送 PubSub 设置到我的服务器以接收 Gmail 推送通知 我得到以下范围 https mail google com https mail google com https www googleapis
  • PHP 生成 UL LI , UL LI

    无法弄清楚如何使用 while 循环生成此菜单 这是我的代码的示例 ul li a href Hoofdmenu 1 a ul class sub li a href Submenu 1 1 a li li a href Submenu 1
  • 如何让 CSS 浮动保持在一行?

    我想使用以下命令将两个项目放在同一行上float left对于左侧的项目 我独自实现这一点没有任何问题 问题是 我想要这两个项目stay在同一条线上即使您将浏览器大小调整得很小 你知道 就像桌子一样 目标是防止右侧的物品缠绕无论 如何使用
  • 如何包装 ui 控件(mapbox 地理定位控件)

    我想扩展 更改具有某些功能的地图框地理定位控件 例如 我想飞到而不是跳到当前位置 我想在打开地理控制按钮时添加一些行为 例如防止拖动 我怎么做 我尝试制作包装纸 但后来遇到了一些问题 按钮的颜色在打开时应变为蓝色 但确实如此 不再工作了 我