2

マップ マーカーにクリック イベントを設定して情報ウィンドウを作成しています。住所をジオコーディングして情報ウィンドウ内に表示しようとしています。

            click: function(marker) {
                pantoUser(lati,longi,i);
                addInfoWindow(lati,longi,name,datestring);
            }

私はほとんどそれが次のように機能しています:

function addInfoWindow(lati,longi,name,datestring)
{
 // get address  
getAddress(lati,longi);

 // create infowindow
$('#dispatcher').gmap3(
  { action: 'addInfoWindow',
    latLng: [lati, longi],
    infowindow:{
      options:{
        content: name
      },
      events:{
        closeclick: function(infowindow, event){
          //alert('closing : ' + $(this).attr('id') + ' : ' + infowindow.getContent());
        }
      },
      apply:[
        { action:'setContent', 
          args:[
          '<span class="infowindow">' + name + '<br />' + content + '<br />' + datestring + '<span>'
          ]
        }
      ]
    }
  }
);

}

次に、アドレスの取得部分:

 function getAddress(lati,longi)
{
    $("#dispatcher").gmap3({
             action:'getAddress',
             latLng: [lati, longi],
             callback:function(results){
             content = results && results[1] ? results && results[1].formatted_address : 'No Address';
         return content;
                }

       });
}

問題は、ジオコーディングされた住所が常に 1 マーカー クリック遅れることです。たとえば、ロンドンのマーカーをクリックしても何も起こりません。もう一度クリックすると、住所が記載された情報ウィンドウが表示されます。次に、マンチェスターのマーカーをクリックすると、まだロンドンの住所が表示されます。次に、リバプールのマーカーをクリックすると、マンチェスターの住所が表示されます。等々。

誰でもバグを見つけることができますか?

SEAN からの更新された実用的なソリューション コールバックに情報ウィンドウ コードを追加しました

function addInfoWindow(lati,longi,name,datestring)
{
// get address
$("#dispatcher").gmap3({
     action:'getAddress',
     latLng: [lati, longi],
     callback:function(results){
     content = results && results[1] ? results && results[1].formatted_address : 'No Address';

// create infowindow       
$('#dispatcher').gmap3(
  { action: 'addInfoWindow',
    latLng: [lati, longi],
    infowindow:{
      options:{
        content: name
      },
      events:{
        closeclick: function(infowindow, event){
          //alert('closing : ' + $(this).attr('id') + ' : ' + infowindow.getContent());
        }
      },
      apply:[
        { action:'setContent', 
          args:[
          '<span class="infowindow">' + name + '<br />' + content + '<br />' + datestring + '<span>'
          ]
        }
      ]
    }
  }
);

    } // end callback

 });

}

4

1 に答える 1

1

これは、標準の Google マップ JavaScript v3 コードのようには見えません。gmap3jQueryから何かへの参照ですか?また、何かがぶら下がっているようには見えません-getAddress関数は を返しますcontentが、関数内のコードaddInfoWindowは値を使用していないようです。

しかし、問題の原因は関数callback内のコードの側面にあるようです。getAddressその呼び出しに続くコードが実行されたときに、コールバックが完了したかどうかを確認することはできませんaddInfoWindow。次のようなことが起こっているようです。

  1. addInfoWindow関数が呼び出されます
  2. 関数内からaddInfoWindow呼び出されますgetAddress
  3. getAddress実行してすぐに完了し、制御を関数に返しaddInfoWindowますが、コールバックはまだ実行されていません
  4. コードを初めて実行するときは、content(コールバックがまだ実行されていないため) まだビルドされていないため、何も表示されません。
  5. addInfoWindow関数の戻りに続いてgetAddress、応答が受信されるため、コールバックが実行されます。content
  6. addInfoWindowが再度呼び出され、同じように実行されますが、今回は最後のコールバックに続いて設定されたコンテンツを使用するためcontent、前回の実行のを使用しています。
  7. シナリオはただ繰り返す、繰り返す、繰り返す

あなたの質問にはいくつかの紛らわしい部分があり、コードにalert呼び出しを追加したり、コードの実行を確認したりすることができないと確信するのは少し難しいですが、コードが上記の手順または非常に類似した手順に従っている可能性が非常に高いようです.

InfoWindowそれがあなたの問題に当てはまると思われる場合、それを回避する最も簡単な方法は、表示コードをコールバック コードに入れることです。そうすれば、応答が返されたときにコールバックが実行されるため、コンテンツが設定されていることがわかります。

于 2012-06-27T12:12:18.520 に答える