Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 同一事件的不同元素(两个异步结果而不是一个)_Jquery_Events_Leaflet_Jquery Events - Fatal编程技术网

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

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

这是一个典型的问题,当你需要处理同一事件的两个元素,但在这种情况下,它会变得一团糟。我使用的是moulate.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 */
             });
      });
第二个绑定事件(内部代码与上面相同):

现在,因为我认为它们在我第一次运行脚本时都是异步的,所以它们都同时运行,并创建两个
/*基于markerslayer数组创建一些div*/
虽然我在开始时有
if

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

  • 我创建了一个空的var
  • 它们异步运行,因此它们将其视为空
  • 它们创建两个结果,而不是一个
  • 附加:当它们再次被激发时,每一个都只重置它自己的结果(就像有一个markerslayer和一个markerslayer\u副本)

  • 这里的代码无法正常工作,因为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 */   
    });