1

同じイベントで2つの要素を処理する必要があるが、この場合は混乱しているという古典的な質問。私は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 */
             });
      });

2番目のバインドされたイベント(上記と同じコード内):

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 */ は持っていますが2つ作成さifれます。

簡単に言えば(私は思う)何が起こっているのか:

  1. 空の変数を作成します
  2. それらは非同期で実行されるため、空であると見なされます
  3. 1つではなく2つの結果を作成します
  4. 追加:それらが再度起動されると、それぞれが独自の結果のみをリセットします(markerslayerとmarkerslayer_copyがあるようなものです)。
4

2 に答える 2

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 */   
});

このように、各投稿はコールバックでデータを受け取り、新しいレイヤーを追加する前に既存のレイヤーをすぐに削除します。

注:これは、コールバックの外部でマーカー配列への参照を保持する必要がないことも意味します(必要に応じて、コードの残りの部分によって異なります)。

于 2012-10-17T14:59:14.960 に答える
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リクエストが2回発生した場合でも、成功するたびに、以前の成功がdomで行ったことを削除するためです。

于 2012-10-17T14:48:42.187 に答える