Google Map API v3 - 超出了最大调用堆栈大小

时间:2014-12-11 10:03:49

标签: javascript jquery google-maps-api-3 widget

过去5或6周,我一直在开发JS widget。这个想法是,它可以通过简单地将href添加到远程.js文件以及具有给定ID的DIV容器来添加到任何站点,以包含窗口小部件的内容。

小部件广泛使用Google Map API,我将其引用如下:

https://maps.googleapis.com/maps/api/js?v=3.exp&libraries=geometry,places&callback=initializeGoogleMaps

当加载小部件时,它将要求用户检查其位置的权限,然后执行该位置的简单地理编码,以便在地图上绘制标记。

一切都运作良好,我必须在开发过程中测试超过2,000次搜索。

我昨天部署了小部件并成功将其嵌入到主机网站中 - 一切都像往常一样完美。然而,今天早上,我的小部件正在通过 Chrome的控制台报告:

而失败
Uncaught RangeError: Maximum call stack size exceeded{main,geometry,places}.js:27 (anonymous function)VM530:33 cVM530:33 TT.(anonymous function).fitBounds{main,geometry,places}.js:48 (anonymous function){main,geometry,places}.js:26 Uf{main,geometry,places}.js:48 O.fitBoundsWRAPPostcodeLocator.js:1541 setupPageWRAPPostcodeLocator.js:964 jQuery.ajax.successjquery.js?time=95944:3 jjquery.js?time=95944:3 k.fireWithjquery.js?time=95944:12 xjquery.js?time=95944:12 b.onload.b.onreadystatechange

由于小部件上次运行,我的代码或主机没有任何更改,因此我怀疑Google API存在问题。

可以在以下位置看到嵌入到虚拟主机中的我的窗口小部件的示例:

http://pcl.solsticecloud.co.uk

花了几个小时试图找到底线,我仍然不是更聪明。

非常感谢任何帮助或建议。

提前谢谢你,

马特

7 个答案:

答案 0 :(得分:5)

感谢Matt Alexander这正是问题和解决方案,但似乎Google更改了位置属性的名称,而不是 .k .D ,现在是 .A .F !,请查看以下控制台日志:

Console Log

答案 1 :(得分:2)

现在它是'.G'和'.K'。如上所述 - 最好使用'.lat()'和'.lng()'。

答案 2 :(得分:1)

您也可以使用

 keys = Object.keys(LatLng);
 geometry.location[keys[0]]; // Obtain value for latitude

答案 3 :(得分:0)

我找到了此问题的原因并进行了修复。

我使用以下代码:

        address = document.getElementById("strSearch").value;

    geocoder.geocode({ 'address': address, componentRestrictions: { country: 'GB' } }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            toggleModal();

            deleteMarkers();
            deleteBanks();

            searchSourceLatLng = new google.maps.LatLng(results[0].geometry.location.k, results[0].geometry.location.B);
            setSearchPointPostcode(results, buildResults);
        }

        else {
            callback();
        }
    })

导致此问题的特定行是:

searchSourceLatLng = new google.maps.LatLng(results[0].geometry.location.k, results[0].geometry.location.B);

" .B"已经工作了几个星期,但现在它似乎不再是一个有效的财产。相反," .D"工作,所以我的代码现在有效。

由于该属性不再有效,我有一个零值的LatLng对象,当我试图查看我的地图边界时,这导致地图崩溃。

我很想知道API的变化方式或原因。

另外,一个愚蠢的问题我确定,但为什么" .k"和" .D"?什么" .Lng"和" .Lat"?

很高兴它排序了,只是希望API不会再次发生变化。

答案 4 :(得分:0)

您可以遍历location的属性并获取坐标而无需直接访问其属性:

geocoder.geocode({ 'address': value.address }, function (results, status) {
if (status === google.maps.GeocoderStatus.OK && results.length > 0) {

    var coords = [];
    for (var key in results[0].geometry.location) {
        coords.push(results[0].geometry.location[key]);
    }
    return {
        'latitude': coords[0],
        'longitude': coords[1]
    };
}
});

答案 5 :(得分:0)

尝试这个希望它会帮助你

allll

答案 6 :(得分:0)

有时此文件有问题: https://www.gstatic.com/charts/loader.js

因此,如果您使用我的,那肯定可以。

代替此:

 <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>

使用这个:

  

google-chart-loader.js

<script src="~/Content/js/google-chart-loader.js"></script>

https://drive.google.com/open?id=1eOPtgJ9FoZ6917q3OcNPKGe3AT-PXIzg