我正在尝试向我的离子应用程序中的leaftlet弹出窗口中的按钮添加一个点击侦听器。
在这里我创建Map和显示标记,也要调用的方法,当标题标签被点击也是下面:
makeCapitalMarkers(map: L.map): void {
let eventHandlerAssigned = false;
this.http.get(this.capitals).subscribe((res: any) => {
for (const c of res.features) {
const lat = c.geometry.coordinates[0];
const lon = c.geometry.coordinates[1];
let marker = L.marker([lon, lat]).bindPopup(`
<h4 class="link">Click me!</h4>
`);
marker.addTo(map);
}
});
map.on('popupopen', function () {
console.log('Popup Open')
if (!eventHandlerAssigned && document.querySelector('.link')) {
console.log('Inside if')
const link = document.querySelector('.link')
link.addEventListener('click', this.buttonClicked())
eventHandlerAssigned = true
}
})
}
buttonClicked(event) {
console.log('EXECUTED');
}
当我单击此标题时,Popup Open&Inside if会打印在控制台中,因此我知道我进入了If语句内部,但由于某种原因,buttonClicked() 函数没有执行。
有人能告诉我为什么这是目前的行为吗?
2条答案
按热度按时间hk8txs481#
我刚刚遇到这个问题,像2小时前。我不熟悉离子,但希望这将有助于。
创建一个变量来跟踪弹出窗口的内容是否已经附加了一个事件处理程序。然后,您可以向Map中添加一个事件侦听器来侦听使用
map.on('popupopen', function(){})
打开的弹出窗口。当发生这种情况时,弹出窗口中的DOM内容将被呈现,并可使用querySelector
或getElementById
获取。因此,您可以将其作为目标,并向其中添加一个事件侦听器。您还必须为map.on('popupclose', () => {})
创建一个事件,并在其中从您已将其附加到的dom节点中删除该事件侦听器。您需要为您创建的每一个唯一的弹出窗口添加一个事件监听器。但是,也许您可以构建一个函数来为您完成这一任务。下面是一个示例:
这就是我如何定位弹出内容并在demo for my plugin中添加指向它的链接。
oug3syen2#
所以,你不能仅仅通过添加静态HTML来实现(click)事件绑定。一种实现的方法是在添加这个新的dom元素后添加侦听器,请参见下面的伪代码:
理想情况下,使用Angular时,我们不应该直接使用DOM,所以如果上面的方法有效,您可以通过Renderer重构添加事件侦听器。
此外,我不熟悉Leaflet库-但要使上述方法正常工作,您需要考虑任何异步方法(如果有),以便仅在将此类DOM元素成功添加到DOM后才调用getElementById。