无法从XML变量加载Google Maps Markers

时间:2013-01-04 19:07:10

标签: jquery ajax google-maps google-maps-api-3

我搜遍了整个地方,并试图寻找其他问题的原因无济于事。 我有一个搜索表单来检索xml数据,数据恢复得很好。

  

响应标头

     

Content-Type text / xml; charset = utf-8 Date Fri,01 Jan   2013 19:00:52 GMT服务器Apache Transfer-Encoding通过1.1分块   decfpxy1(NetCache NetApp / 6.0.2)

     

回应:

<markers><marker id="1" lat="48.153938" lng="17.108459" /></markers>

但是我的data变量没有在我的脚本中插入任何加载标记的内容,我收到此错误:

  

TypeError:xml未定义[在此错误时出现错误]

     

var markers = xml.documentElement.getElementsByTagName(“marker”);

这是代码:

function SendData() {




    var FromDateUnformatted = $('#from').val().split('/');
    var FromDate = FromDateUnformatted[2] + '-' + FromDateUnformatted[0] + '-' + FromDateUnformatted[1] + ' 00:00:00';
    var ToDateUnformatted = $("#to").val().split('/');
    var ToDate = ToDateUnformatted[2] + '-' + ToDateUnformatted[0] + '-' + ToDateUnformatted[1] + ' 23:59:59';
    var MusicStyles = $("#music").val();
    var Locations = $("#locations").val();
    var FromPrice = $("#entrance-price").slider("values", 0);
    var ToPrice = $("#entrance-price").slider("values", 1);
    var IsOutdoors = +$('#IsOutdoors').is(':checked');
    var HasPatio = +$('#HasPatio').is(':checked');


    $.ajax({
        type: "POST",
        url: "MapSearchxml.php",
        data: {
            dataFromDate: FromDate,
            dataToDate: ToDate,
            dataMusicStyles: MusicStyles,
            dataLocations: Locations,
            dataFromPrice: FromPrice,
            dataToPrice: ToPrice,
            dataIsOutdoors: IsOutdoors,
            dataHasPatio: HasPatio
        },
        beforeSend: function (html) { // this happens before actual call
            $("#results").html('Please Wait');
            $("#searchresults").show();
            $(".phpFromDate").html(FromDate);
        },
        success: function (data) {
            //clearOverlays();
            var xml = data.responseXML;
            var markers = xml.documentElement.getElementsByTagName("marker");

            for (var i = 0; i < markers.length; i++) {
                var name = markers[i].getAttribute("id");
                var point = new google.maps.LatLng(
                parseFloat(markers[i].getAttribute("lat")), parseFloat(markers[i].getAttribute("lng")));

                var html = "<b>" + point + "</b>hello <br/>";
                var icon = new google.maps.MarkerImage("redmarker.png");

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

                bindInfoWindow(marker, map, infoWindow, html);
            }
        }
    });



    function bindInfoWindow(marker, map, infoWindow, html) {
        google.maps.event.addListener(marker, 'click', function () {
            infoWindow.setContent(html);
            infoWindow.open(map, marker);
        });
    }

}

这是PHP文件本身:

$result = mysql_query($query);
if (!$result) {
  die('Invalid query: ' . mysql_error());
}


header("Content-type: text/xml");

echo '<markers>';

while ($row = @mysql_fetch_assoc($result)){
  echo '<marker ';
  echo 'id="' . parseToXML($row['ID']) . '" ';
  echo 'lat="' . parseToXML($row['LAT']) . '" ';
  echo 'lng="' . parseToXML($row['LNG']) . '" ';
  echo '/>';
}

echo '</markers>';

我已经使用此代码的变体来检索静态xml php文件而没有任何问题,但是使用此代码,我无法从此帖子中获取结果并将其正确插入我的标记构建器。

我在这里和谷歌做过大量的研究,我似乎无法在任何地方找到任何替代品。

你知道这个问题是什么吗?

由于

2 个答案:

答案 0 :(得分:3)

提供给success-callback的第一个参数不是(jq)XHR对象,它是数据(取决于请求,这可能是一个字符串,一个解析为对象的JSON字符串,或文件)。

他们都没有财产responseXML

所以你可以直接使用这个文件:

var xml = data;

或使用第三个参数:

success: function (data,status,jqXHR) {
         var xml = jqXHR.responseXML;
         //....
         }

但无论你做什么,最好为请求指定dataType:'xml',以确保成功的结果是xml文档。

答案 1 :(得分:2)

你的“map”变量是onload函数的本地变量,它在AJAX回调例程运行的全局上下文中不可用,因此在这里使用它时没有正确定义:

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

要使其全局化,请在全局上下文中执行var map;(在任何函数之外),然后在onload函数中初始化它(就像现在一样,只需从它前面删除“var”)