0

グーグルマップマーカーを作成する機能があります。データベースクエリからデータを渡します。次に、1つの値を外部キーとして使用して、関数に別のデータベースクエリを実行させます。次に、すべての結果(最初のクエリのデータと2番目のクエリのデータ)を文字列に入れようとしています。この文字列は、マーカーが情報ウィンドウに表示されます。

しかし、どういうわけか、2番目のクエリの$ .post関数の外で文字列を作成しない限り、プログラムは文字列を「未定義」と見なします。どうしたの?プログラムはその文字列を読み取ることができるべきではありませんか?

これが私のコードです:

function createMarker(marker_id, point,street, neighborhood, date,map) {
            // Create the HTML text based on the values passed in from XML
            $.post('get_victimdata.php', {marker_id:marker_id},
                 function(victimdata){

                     objVictimdata = jQuery.parseJSON(victimdata);
                     markerhtml = "";
                      markerhtml += "<strong>Street: </strong>" + street + "<br>";
                      markerhtml += "<strong>Neighborhood: </strong>" + neighborhood + "<br>";
                      markerhtml += "<strong>Date: </strong>" + date + "<br><br>";
                     for (var i=0; i < objVictimdata.length; i++) {
                         var image_path = objVictimdata[i].image_path;
                         var image_height = objVictimdata[i].image_height;
                         markerhtml += "<strong>Victim Name: </strong>" + objVictimdata[i].name + "<br>";
                         markerhtml += "<strong>Age:</strong> " + objVictimdata[i].age + "<br>";
                         markerhtml += "<strong>Race:</strong> " + objVictimdata[i].race + "<br>";
                         markerhtml += "<strong>Gender:</strong> " + objVictimdata[i].gender + "<br>";
                         markerhtml += "<strong>Cause:</strong> " + objVictimdata[i].cause + "<br><br>";
                         console.log(markerhtml);

                     }//end for

            })//end post
            console.log(markerhtml);


            var image = new google.maps.MarkerImage('http://labs.google.com/ridefinder/images/mm_20_green.png',
            new google.maps.Size(12, 20),
            new google.maps.Point(0,0),
            new google.maps.Point(6, 20));

            var marker = new google.maps.Marker({
              position: point,
              map: map,
              icon: image
            });

            var infoWindow = new google.maps.InfoWindow(); //initialize infoWindow
              // Add a click event to each marker which will open the HTML window
            marker.infowindow = new google.maps.InfoWindow({
              content: markerhtml
            });


            google.maps.event.addListener(marker, "click", function() {
                marker.infowindow.open(map, marker);
            });

};//end create marker
4

1 に答える 1

0

次のコードを試してください。違いは、ポストが成功した場合にのみ起動される匿名関数内の $.post への呼び出しに続くすべてのステートメントを配置したことです。$.Post を呼び出すと、ポストが完了するまで内部の関数は実行されませんが、ポストがバックグラウンドで発生している間も、実行は次のステートメントに続きます!

言い換え内部無名関数は、ほとんどのコードを含むように拡張されました。違いがわからない場合は、WinMerge などのプログラムを使用してみてください。違いが表示されます。違いを示す winmerge

function createMarker(marker_id, point,street, neighborhood, date,map) {
            // Create the HTML text based on the values passed in from XML
            $.post('get_victimdata.php', {marker_id:marker_id},
                 function(victimdata){

                     objVictimdata = jQuery.parseJSON(victimdata);
                     markerhtml = "";
                      markerhtml += "<strong>Street: </strong>" + street + "<br>";
                      markerhtml += "<strong>Neighborhood: </strong>" + neighborhood + "<br>";
                      markerhtml += "<strong>Date: </strong>" + date + "<br><br>";
                     for (var i=0; i < objVictimdata.length; i++) {
                         var image_path = objVictimdata[i].image_path;
                         var image_height = objVictimdata[i].image_height;
                         markerhtml += "<strong>Victim Name: </strong>" + objVictimdata[i].name + "<br>";
                         markerhtml += "<strong>Age:</strong> " + objVictimdata[i].age + "<br>";
                         markerhtml += "<strong>Race:</strong> " + objVictimdata[i].race + "<br>";
                         markerhtml += "<strong>Gender:</strong> " + objVictimdata[i].gender + "<br>";
                         markerhtml += "<strong>Cause:</strong> " + objVictimdata[i].cause + "<br><br>";
                         console.log(markerhtml);

                     }//end for
                    console.log(markerhtml);


                    var image = new google.maps.MarkerImage('http://labs.google.com/ridefinder/images/mm_20_green.png',
                    new google.maps.Size(12, 20),
                    new google.maps.Point(0,0),
                    new google.maps.Point(6, 20));

                    var marker = new google.maps.Marker({
                      position: point,
                      map: map,
                      icon: image
                    });

                    var infoWindow = new google.maps.InfoWindow(); //initialize infoWindow
                      // Add a click event to each marker which will open the HTML window
                    marker.infowindow = new google.maps.InfoWindow({
                      content: markerhtml
                    });


                    google.maps.event.addListener(marker, "click", function() {
                        marker.infowindow.open(map, marker);
                    });


            })//end post

};//end create marker
于 2012-05-25T17:56:57.550 に答える