0

ここで厄介な状況に陥っています。このトピックが Stackoverflow で議論されているという事実に関して、誰かが私を助けてくれることを願っています。

私はループを使用して XML を読み取り、その XML のノードに基づいてマーカーを作成しています。また、そのループ内で、そのループの外側にある関数を呼び出して、XML から取得したコンテンツを含むすべてのマーカーの InfoWindow を作成します。

  • ループの外側と関数の内側に InfoWindows を作成します。これを行わないと、どのマーカーをクリックしても、マップの最後に追加されたマーカーの上に常に同じ InfoWindows が表示されるからです。
  • InfoWindows グローバルを定義すると、すべての InfoWindows が最後に作成されたマーカーと同じ内容を表示します。

これはコードです:

function xml_Leer() {       

    function agregar_datos(marcador, map, direccion, telefono, dias_habiles, sabado, domingo) {
        var datos = new google.maps.InfoWindow({content: "<h2>"+nombre+"</h2><p>"+direccion+"</p><p>"+telefono+"</p><ul><li>Lunes a Viernes: "+dias_habiles+"</li><li>S&aacute;bados: "+sabado+"</li><li>Domingos: "+domingo+"</li></ul>"});
        google.maps.event.addListener(marcador, 'click', function() {datos.open(map,marcador);});
    } 

    var iglesias = xml.getElementsByTagName("iglesia");

    for(var i=0; i<iglesias.length; i++) {
        var nombre = iglesias[i].getElementsByTagName("nombre")[0].childNodes[0].nodeValue;

        var direccion = iglesias[i].getElementsByTagName("direccion")[0].childNodes[0].nodeValue;
        var telefono = iglesias[i].getElementsByTagName("telefono")[0].childNodes[0].nodeValue;

        var dias_habiles = iglesias[i].getElementsByTagName("horarios")[0].getElementsByTagName("dias_habiles")[0].childNodes[0].nodeValue;
        var sabado = iglesias[i].getElementsByTagName("horarios")[0].getElementsByTagName("sabado")[0].childNodes[0].nodeValue;
        var domingo = iglesias[i].getElementsByTagName("horarios")[0].getElementsByTagName("domingo")[0].childNodes[0].nodeValue;

        var tipo = iglesias[i].getAttribute("tipo");


        var ubicacion = new google.maps.LatLng(iglesias[i].getAttribute("lat"), iglesias[i].getAttribute("lng"));

        var marcador = new google.maps.Marker({position: ubicacion, animation: google.maps.Animation.DROP, map: map, title:nombre });

        agregar_datos(marcador, map, direccion, telefono, dias_habiles, sabado, domingo); 
    }

}

これが適切にコーディングされていない場合、XML から取得した情報を InfoWindow のコンテンツに表示する必要があることを考慮して、どのように InfoWindow を作成する必要がありますか?

前もって感謝します。


このコードは機能しますが、方法がわかりません。ただ... 機能します。

var datos = new google.maps.InfoWindow();
function agregar_datos(marcador, map, direccion, telefono, dias_habiles, sabado, domingo) {
    var datos = new google.maps.InfoWindow({content: "<h2>"+nombre+"</h2><p>"+direccion+"</p><p>"+telefono+"</p><ul><li>Lunes a Viernes: "+dias_habiles+"</li><li>S&aacute;bados: "+sabado+"</li><li>Domingos: "+domingo+"</li></ul>"});
    google.maps.event.addListener(marcador, 'click', function() { if(window.datos){window.datos.close();} window.datos=datos; datos.open(map,marcador);});
} 
4

2 に答える 2

0

最後に開いた情報ウィンドウを保存する 1 つのグローバル変数を作成します。新しい infoWindow を開くと、このグローバル変数にアクセスしてウィンドウを閉じることができます。

グローバルスコープのどこか:

var datos;

agregar_datos() で:

2 行目を削除し、これを追加します。

google.maps.event.addListener(marcador, 'click', 
   function() {
     if(window.datos){window.datos.close();}
     window.datos=datos;
     datos.open(map,marcador);
});

より良い解決策: infoWindow を 1 つだけ使用します。

グローバルスコープのどこか:

var datos=new google.maps.InfoWindow();

agregar_datos() で:

行を削除します:

var datos = new google.maps.InfoWindow(/*....*/);

これを追加します:

google.maps.event.addListener(marcador, 'click', 
       function() {
         window.datos.close();
         window.datos.setContent("put your content here");
         datos.open(map,marcador);
    });
于 2013-01-22T23:39:29.580 に答える
0

これは、javascript クロージャの問題が原因であると思われます。ここを見てください。まったく同じ問題です。 https://stackoverflow.com/a/8326203/684229

marcador クリック イベント ハンドラーが起動さmarcadorれると、関数呼び出しの変数が使用されますが、これは for ループの最後のマーカーに既に変更されているため、問題があります。

の代わりにagregar_datos()使用するように関数内のコードを変更してみてください:thismarcador

google.maps.event.addListener(marcador, 'click', function() {datos.open(map, this);});
于 2013-01-22T22:57:59.393 に答える