Jquery 同一事件的不同元素(两个异步结果而不是一个)
这是一个典型的问题,当你需要处理同一事件的两个元素,但在这种情况下,它会变得一团糟。我使用的是moulate.js,但会使代码更通用 空的var声明:Jquery 同一事件的不同元素(两个异步结果而不是一个),jquery,events,leaflet,jquery-events,Jquery,Events,Leaflet,Jquery Events,这是一个典型的问题,当你需要处理同一事件的两个元素,但在这种情况下,它会变得一团糟。我使用的是moulate.js,但会使代码更通用 空的var声明: var markerslayer; 第一个绑定事件: $("#slider").on("valuesChanged", function (e){ var markers = new Array(); //check if empty, otherwise resets laye
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 */
});
});
第二个绑定事件(内部代码与上面相同):
现在,因为我认为它们在我第一次运行脚本时都是异步的,所以它们都同时运行,并创建两个/*基于markerslayer数组创建一些div*/
虽然我在开始时有if
简言之(我认为)正在发生的是:
这里的代码无法正常工作,因为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所做的操作。问题是,在调用
post
之前,您正在检查是否存在markerslayer
,这意味着另一个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 */
});
这样,每一篇文章都将在回调中接收数据,然后在添加新层之前立即删除任何现有层
注意:这也意味着您不需要(必须-取决于代码的其余部分)在回调之外保留对标记数组的引用。为什么不将
post
移动到当前if块上的if(!markerslayer)
或else
中?目前,你总是会得到新的标记,不管它们是否已经存在exist@SteveGreatrex因为我想在每次触发事件时从post
接收新数据(并更新markerslayer
)。第一次可以获取标记,但它们会生成重复的标记层。在这种情况下,您应该移动/*进行一些div*/
和if(标记层){map.removeLayer…
从帖子
@SteveGreatrex谢谢你的代码是正确的。我有同样的方法,但在简化它时我感到困惑。我在上面更新了。@DDL449注意我答案末尾的评论(以及steve的评论),我想这会解决你的问题。
$.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 */
});