Mapbox 事件监听器

Posted

技术标签:

【中文标题】Mapbox 事件监听器【英文标题】:Mapbox event listener 【发布时间】:2018-09-17 11:54:20 【问题描述】:

我已将自定义按钮添加到我的 MapBox 地图中,并且它们可以正确购物。然而 当我添加点击监听器时它不起作用。我在控制台中看不到任何错误。

代码如下所示:

const currentLocationControl = new CustomControl('current-location-control', 'GPS');

this.map.addControl(currentLocationControl, 'top-left');

document.getElementById('test').addEventListener('click', function (e) 
    alert('test');
);

我在vue.jsmounted 方法中执行此代码。

自定义控件:

export default class CustomControl 

    constructor(className, text) 
        this.className = className;
        this.text = text;
    

    onAdd(map)
        this.map = map;
        this.container = document.createElement('div');
        this.container.id = 'test';
        this.container.className = this.className;
        this.container.textContent = this.text;
        return this.container;
    
    onRemove()
        this.container.parentNode.removeChild(this.container);
        this.map = undefined;
    

当我console.log(document.getElementById('test')); 时,我在控制台(测试 div)中看到了预期的结果。

那么这里会发生什么?

【问题讨论】:

这很可能是因为您在 javascript 中构建它,因此当您尝试绑定使用时它在 DOM 中不可用。改为使用最近的静态父元素的事件委托 任何人????!?!?! 你尝试过我告诉你的吗? @ohgodwhy 它在 vue.js 组件中,所以没有静态父级对吗?感谢您的帮助。 只需在该特定行放置一个断点并检查该元素是否真的存在。此外,可以绑定事件,但按钮可能会出现在地图下方,因此您实际上单击的是地图而不是按钮。你有正确的 z 索引吗? 【参考方案1】:

很可能该元素还不存在,这取决于map.addControl 的工作方式。

也许如果您在 CustomControl 中创建了一个方法来返回容器,而不是使用 document.getElementById 您会使用类似 currentLocationControl.getContainer() 的东西?

或者在你的CustomControl 中添加一个setAction

setAction(action) 
    this.container.addEventListener('click', action);

【讨论】:

【参考方案2】:

为确保单击事件绑定到正确的元素,您可以改为在类声明中绑定事件。

将点击事件的回调传递给自定义控件

const clickCallback = function(e) 
  alert(test);
;

const currentLocationControl = new CustomControl(
  "current-location-control",
  "GPS",
  clickCallback
);

类声明:

// add clickCallback to constructor
export default class CustomControl 
  constructor(className, text, clickCallback) 
    //...
  

  onAdd(map) 
    //...
    this.container.onclick = clickCallback;
    //...
  

【讨论】:

@Jenssen 我可以知道你是如何实现它的吗?我很好奇为什么它不起作用

以上是关于Mapbox 事件监听器的主要内容,如果未能解决你的问题,请参考以下文章

mapbox如何监视地图的样式更换

脱坑记录--- removeEventListener 移除事件监听失败的经历--vue--keep-alive-----完美实现echarts自适应屏幕~~~~

怎样理解js中的事件监听

Spring事件监听机制源码解析

JavaFX实战:几种事件监听实现,键盘按键事件监听,鼠标滚轮事件监听,鼠标按键事件监听,鼠标移动事件监听

JavaFX实战:几种事件监听实现,键盘按键事件监听,鼠标滚轮事件监听,鼠标按键事件监听,鼠标移动事件监听