javascript - 传单Angular中的.on函数内的addEventListener
问题描述
我是编程新手,目前正在构建一个带有传单的小型 Angular 应用程序。我有一堆标记都在 markerClusterGroup 中。当我右键单击任何标记时,我构建了一个自定义上下文菜单来执行。当上下文菜单打开时,它有一些功能(例如:显示单击的标记坐标、显示单击的标记弹出窗口、使单击的标记可拖动等)。问题是,如果我打开上下文菜单并单击要执行的函数,它只会执行一次。但是下次我这样做时,它会执行两次(每次新的点击增加 1)。例如,如果我单击一个函数以连续 4 次显示带有坐标的警报,则第 4 次警报将执行 4 次。有人可以告诉我我做错了什么吗?我不擅长事件处理,所以可能就是这样。代码如下:
组件.ts:
this.markers123.on("contextmenu", function(event){
var contextElement = document.getElementById("context-menu");
var markerz=event;
contextElement.style.top = markerz.offsetY + "px";
contextElement.style.left= markerz.offsetX + "px";
contextElement.draggable=true;
contextElement.classList.add("active");
var marker4;
document.getElementById("showPopup").addEventListener("click", function(){
event.layer.bindPopup(event.layer.latLng).openPopup();
console.log(markerz.layer);
});
var showCoord= document.getElementById("showCoord");
showCoord.addEventListener("click", function(){
(<HTMLInputElement>document.getElementById("lat12")).value=markerz.latlng.lat; //latlng is written to an input field
(<HTMLInputElement>document.getElementById("lon12")).value=markerz.latlng.lng;
});
var deleteMarker= document.getElementById("deleteMarker");
deleteMarker.addEventListener("click", function(){
markerz.layer.dragging.enable();
});
var saveMarker= document.getElementById("saveMarker");
saveMarker.addEventListener("click", function(){
event.layer.dragging.disable();
alert("Lat- " + (<HTMLInputElement>document.getElementById("lat12")).value + " Lng- " + (<HTMLInputElement>document.getElementById("lon12")).value + " Lokacija: " + (<HTMLInputElement>document.getElementById("naziv123")).value);
});
event.layer.off('click').on('move', function(a){
marker4 = a;
var position= marker4.latlng;
(<HTMLInputElement>document.getElementById("lat12")).value=marker4.latlng.lat;
(<HTMLInputElement>document.getElementById("lon12")).value=marker4.latlng.lng;
});
});
window.addEventListener("click",function(){
document.getElementById("context-menu").classList.remove("active");
html中的上下文菜单:
<div id="context-menu">
<div id="showPopup" class="item">
<i class="fa fa-cut"></i> Show popup
</div>
<div id="showCoord" class="item">
<i class="fa fa-clone"></i> Show coord
</div>
<div class="item" id="deleteMarker">
<i class="fa fa-refresh"></i> Modify
</div>
<div class="item" id="saveMarker">
<i class="fa fa-times"></i> End modify
</div>
</div>
解决方案
这是因为每次打开 contextmenu 时,都会向 object / html 元素添加一个新的侦听器,然后将侦听器堆叠起来。
当您删除旧的/现有的侦听器时,您可以防止这种情况发生。查看此答案如何删除事件侦听器
推荐阅读
- powershell - 如何运行与 PowerShell 别名同名的命令?
- javascript - 未捕获的类型错误:无法读取 null Chrome 2020 的属性“clientHeight”
- html - 输入元素高度大于字体大小
- javascript - 按顺序检索对象的条目
- docker - 如何在 Kubernetes 内部调用 Redis?删除旧 Redis 服务的问题
- flutter - 如何使一行可点击?扑
- ssis - ODBC 源版本 clsid {9EAC76F9-8D61-4F12-9E7B-529CF31765A1} 与此版本的 DataFlow 不兼容。"
- python - numpy矩阵链乘法是否优化?
- python-3.x - Tensorflow GPU:错误说.dll文件未找到,但它确实存在
- java - 在Android中定义相同的ID可以吗?