一个经典的问题,当你需要处理同一事件的两个元素时,但在这种情况下,它会搞砸。我使用leaflet.js但会使代码更通用
空var声明
var markerslayer;
第一个绑定事件
$("#slider").on("valuesChanged", function (e){
var markers = new Array();
//check if empty, otherwise resets layer
if(markerslayer){
map.removeLayer(markerslayer);
};
/*some more code here */
$.post (a.php file here, {some data}, function(data){
/* markerslayer array is made here */
/* add a layer based on markerslayer array */
});
});
第二个绑定事件(与上面相同的代码)
map.on("moveend", function (e){
var markers = new Array();
//check if empty, otherwise resets layer
if(markerslayer){
map.removeLayer(markerslayer);
};
/*some more code here */
$.post (a.php file here, {some data}, function(data){
/* markerslayer array is made here */
/* add a layer based on markerslayer array */
});
});
现在因为我认为他们第一次运行我的脚本时它们都是异步,它们都同时运行并且它们创建了两个/* make some divs based on markerslayer array */
虽然我在开头有if
。
简而言之(我认为)正在发生的事情是:
答案 0 :(得分:2)
问题是您在调用markerslayer
之前检查是否存在post
,这意味着其他post
可以在此期间返回并创建它:
要解决此问题,请将删除代码移至post
回调:
$.post (a.php file here, {some data}, function(data){
if(markerslayer){
map.removeLayer(markerslayer);
};
/* markerslayer array is made here */
/* add a layer based on markerslayer array */
});
这样,每个帖子都会在回调中接收数据,然后在添加新图层之前立即删除任何现有图层。
注意:这也意味着你不会(必然 - 取决于代码的其余部分)需要在回调之外保留对markers数组的引用。
答案 1 :(得分:1)
这里的代码不会按预期工作,因为ajax是异步的:
/*some more code here */
$.post (a.php file here, {some data}, function(data){
/* markerslayer array is made here */
});
/* make some divs based on markerslayer array */
应该改为:
/*some more code here */
$.post (a.php file here, {some data}, function(data){
/* markerslayer array is made here */
/* make some divs based on markerslayer array */
});
我不确定您的代码中还有其他内容,但这太大了,无法发布评论。
我会将if语句移动到$ .post内部,以防止出现重复的标记,因为即使ajax请求发生两次,每次成功都会删除之前成功对dom执行的操作。