Javascript 重新打开弹出窗口后,Marker Popup jQuery事件不再触发

Javascript 重新打开弹出窗口后,Marker Popup jQuery事件不再触发,javascript,jquery,leaflet,Javascript,Jquery,Leaflet,我有一个附在标记上的小册子弹出窗口,它给了用户两个按钮来取消或使用jQuery转到另一个页面 按钮一开始可以正常工作,除非您一次准确地单击标记,弹出窗口消失,然后再次单击标记,弹出窗口再次显示,然后突然按钮不再工作 我在浏览器控制台中也没有收到任何错误消息 可能是什么问题 var marker; var addPopup = function(e, marker) { var popup = L.popup({closeButton:false}) .setContent('&

我有一个附在标记上的小册子弹出窗口,它给了用户两个按钮来取消或使用jQuery转到另一个页面

按钮一开始可以正常工作,除非您一次准确地单击标记,弹出窗口消失,然后再次单击标记,弹出窗口再次显示,然后突然按钮不再工作

我在浏览器控制台中也没有收到任何错误消息

可能是什么问题

var marker;

var addPopup = function(e, marker) {
    var popup = L.popup({closeButton:false})
    .setContent('<button type="submit" class="btn btn-primary" id="ok">Ok</button><button type="submit" class="btn btn-primary" id="nok">Cancel</button>');
    marker.bindPopup(popup).openPopup();
    var Coordinates= JSON.stringify(e.latlng);
    popupAction(Coordinates, marker);
};

var popupAction= function(Coordinates, marker){
    $('#ok').on('click', function (){
      console.log('do something');  
    });
    $('#nok').on('click', function (){
        mymap.removeLayer(marker);
    });
};

mymap.on('click', function (e) {
    if (marker) {
        mymap.removeLayer(marker);
    }
    marker = new L.Marker(e.latlng).addTo(mymap);
    addPopup(e, marker);            
});
var标记;
var addPopup=函数(e,标记器){
var popup=L.popup({closeButton:false})
.setContent('OkCancel');
marker.bindPopup(popup.openPopup();
var坐标=JSON.stringify(e.latlng);
弹出动作(坐标、标记);
};
var popupAction=函数(坐标、标记){
$('#ok')。在('单击',函数(){
log('do something');
});
$('#nok')。在('click',函数(){
mymap.removeLayer(标记);
});
};
mymap.on('click',函数(e){
如果(标记){
mymap.removeLayer(标记);
}
标记=新的L.标记(e.latlng).addTo(mymap);
添加弹出窗口(e,标记);
});

下次打开弹出窗口时,事件侦听器很可能丢失。传单可能会重新创建弹出内容,因此您的事件侦听器不再附加到此新内容

因此,想到的一个解决方法是对标记的事件重新执行
popupAction
函数(将事件侦听器附加到弹出按钮上)

当绑定到此层的弹出窗口打开时激发

不幸的是,这样做会产生另一个bug,因为当用户在地图上的其他地方单击时,您已经有了一个打开弹出窗口的标记,您将删除该标记并创建一个新的标记,该标记具有新的弹出内容,但具有相同的按钮ID。因此,当jQuery尝试附加侦听器时,它会查找以前的按钮,而不是新按钮。一个新的解决方法是使用
id
之外的其他东西作为选择器,这样jQuery也可以找到新按钮,例如类

一个合适的解决方案就是使用jQuery,这很容易实现:

var mymap=L.map(“map”);
var标记;
var addPopup=函数(e,标记器){
var popup=L.popup({
关闭按钮:false
})
.setContent('OkCancel');
marker.bindPopup(popup.openPopup();
};
//使用事件委派,这样可以从DOM中删除按钮,但事件侦听器将保留在父容器上。
// http://api.jquery.com/on/
// https://learn.jquery.com/events/event-delegation/
$('map')。在('click','ok',function()上{
log('do something');
}).on('click','nok',function(){
mymap.removeLayer(标记);
});
mymap.on('click',函数(e){
如果(标记){
mymap.removeLayer(标记);
}
标记=新的L.标记(e.latlng).addTo(mymap);
添加弹出窗口(e,标记);
});
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png'{
属性:“©;贡献者”
}).addTo(mymap);
mymap.setView([48.85,2.35],12)

非常好,非常感谢您的详细解释,问题解决了!