【问题标题】:Google Map API v3, load infoWindow content via setContent using AJAXGoogle Map API v3,使用 AJAX 通过 setContent 加载 infoWindow 内容
【发布时间】:2015-04-04 17:15:42
【问题描述】:

我正在以 XML 格式从数据库加载标记并使用 for() 循环将其分解,但我有一个 addListener 事件“单击”,其中包含我遇到问题的 AJAX 调用。我正在尝试使用在 ajax 调用中下拉的数据填充 infoWindow 的内容。

这是我在 for() 循环中的代码副本:

var mkID = mk[i].getAttribute("id");

marker = new google.maps.Marker({
    position: point,
    map: map,
    icon: "/img/icon.png",
    title: "Click to Show"
});

infoWindow = new google.maps.InfoWindow({
    content: "<i class='fa fa-spinner fa-spin fa-lg' style='color: #FFA46B;' title='Loading...'></i> Loading..."
});

markerArray.push(marker);

google.maps.event.addListener(marker, 'click', (function(marker, infoWindow, mkID) {
    return function() {
        if(infoWindow) {
            infoWindow.close();
        }
        infoWindow.open(map, marker);
        $.ajax({
            url: '/map-info-ajax.html?id=' + mkID,
            success: function(data) {
                infoWindow.setContent(data);
            }
        });
    };
})(marker, infoWindow, mkID));

我尝试改变这个:

infoWindow = new google.maps.InfoWindow({
    content: "<i class='fa fa-spinner fa-spin fa-lg' style='color: #FFA46B;' title='Loading...'></i> Loading..."
});

仅此:

infoWindow = new google.maps.InfoWindow();

但是当 data 确实包含“xyzzy ya ya ya”时,信息窗口现在只是空白。谁能看到我在这里做错了什么?

问候, 文斯

【问题讨论】:

  • 请提供一个Minimal, Complete, Tested and Readable example 来证明该问题。这实际上是 this example from the documentation for the Places API 在请求地点详细信息时所做的。
  • 为什么不首先加载信息窗口内容和标记?
  • @MrUpsidown 当我建立一个网站时,我总是试图想象它每天至少会收到 1,000,000 次点击,并且它们都将通过手机获得。因此,我尽我所能减少所需的 PHP、MySQL、HTML、CSS 和 JavaScript 解析时间/带宽。此外,事后通过 AJAX 拉下信息窗口内容是 Google Map API 开发人员在这里非常合乎逻辑和普遍的要求。我唯一的问题是,到目前为止,我无法获得任何解决方案来访问通过 AJAX 下拉的“数据”以在我的代码中工作。我需要新鲜的眼睛。
  • 你调试了吗? ajax 请求有效吗?你仔细检查了网址吗?成功回调中是否返回任何内容?如果是,它看起来像什么?帮助我们为您提供帮助。
  • 顺便说明一下,我会设置内容并然后打开信息窗口,而不是相反。

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


【解决方案1】:

终于搞定了。这是代码现在的样子。

var mkID = mk[i].getAttribute("id");

marker = new google.maps.Marker({
    position: point,
    map: map,
    icon: "/img/icon.png",
    title: "Click to Show"
});

infoWindow = new google.maps.InfoWindow({
    content: "<i class='fa fa-spinner fa-spin fa-lg' style='color: #FFA46B;' title='Loading...'></i> Loading..."
});

markerArray.push(marker);

google.maps.event.addListener(marker, 'click', (function(marker, infoWindow, mkID) {
    return function() {
        if(infoWindow) {
            infoWindow.close();
        }
        infoWindow.open(map, marker);
        infoWindowAjax(mkID, function(data) {
            infoWindow.setContent(data);
        });
    };
})(marker, infoWindow, mkID));

以及它调用的 infoWindowAjax() 函数。

function infoWindowAjax(mkID, callback) {
    return $.ajax({
        url: '/map-info-ajax.html?id=' + mkID
    })
    .done(callback)
    .fail(function(jqXHR, textStatus, errorThrown) {
        alert(errorThrown);
    });
}

我不得不将 ajax 调用移到它自己的函数中,并使用回调将信息返回到我可以在它运行后使用它的位置。

PS:我使用的是 jQuery v2.1.1。

PPS:如果返回的数据只是简单的原始文本,甚至是 UTF-8 内容,请确保 PHP 模板头设置为 header("Content-type: text/html; charset=UTF-8" );。我遇到的一个小错误是我将我的设置错误地设置为 text/xml

【讨论】:

  • 很高兴看到你把它整理好了。你是对的,标题部分(服务器端)很重要。您可能还想在 ajax 请求上定义 dataType,尽管它应该按照文档所述进行 智能猜测
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-04
  • 2011-03-23
  • 2011-07-14
  • 1970-01-01
  • 2013-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多