不同的元素相同的事件(两个异步结果而不是一个)/ jQuery

时间:2012-10-17 14:41:11

标签: events javascript-events jquery leaflet

一个经典的问题,当你需要处理同一事件的两个元素时,但在这种情况下,它会搞砸。我使用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

简而言之(我认为)正在发生的事情是:

  1. 我创建了一个空var
  2. 他们以异步方式运行,因此他们认为它是空的
  3. 他们创建两个结果而不是一个
  4. 附加:当他们再次被解雇时,每个人只重置自己的结果(就像那里有一个标记层和一个markerslayer_copy)。

2 个答案:

答案 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执行的操作。