1

我正在使用谷歌地图 API 来设计“地震地图”。到目前为止,一切都很好。

该地图在 Firefox 和 Chrome 中显示良好,但在 IE8 中引发错误:

网页错误详情

用户代理:Mozilla/4.0(兼容;MSIE 7.0;Windows NT 5.1;Trident/4.0;.NET CLR 1.1.4322;.NET CLR 2.0.50727;InfoPath.3)时间戳:2013 年 5 月 3 日星期五 08:13:44世界标准时间

消息:对方法或属性访问的意外调用。行:9 字符:238 代码:0 URI:http ://maps.gstatic.com/intl/pt_ALL/mapfiles/api-3/12/10/main.js

<!DOCTYPE html>
<html> 
<head> 
  <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> 
  <title>Google Maps Multiple Markers</title> 
  <script src="http://maps.google.com/maps/api/js?sensor=false" 
          type="text/javascript"></script>
</head> 
<body>
  <div id="map" style="width: 400px; height: 650px;"></div>
  <script type="text/javascript">

var Parsed = [[]];
var txtFile; 
if (window.XMLHttpRequest) { // Mozilla, Safari, ...
    txtFile = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE 8 and older
    txtFile = new ActiveXObject("Microsoft.XMLHTTP");
}
txtFile.open("GET", "http://foo/f4/stats/nServsCodigoPostal.csv", true);
txtFile.onreadystatechange = function(){
if (txtFile.readyState === 4){  // Makes sure the document is ready to parse.
    if (txtFile.status === 200){  // Makes sure it's found the file.

        allText = txtFile.responseText; 
        Parsed = CSVToArray(allText, ";")
        }
    }
    function CSVToArray( strData, strDelimiter ){

        strDelimiter = (strDelimiter || ",");
        var objPattern = new RegExp(
            (
                // Delimiters.
                "(\\" + strDelimiter + "|\\r?\\n|\\r|^)" +

                // Quoted fields.
                "(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" +

                // Standard fields.
                "([^\"\\" + strDelimiter + "\\r\\n]*))"
            ),
            "gi"
            );
        var arrData = [[]];
        var arrMatches = null;
        while (arrMatches = objPattern.exec( strData )){
            var strMatchedDelimiter = arrMatches[ 1 ];
            if (
                strMatchedDelimiter.length &&
                (strMatchedDelimiter != strDelimiter)
                ){
                arrData.push( [] );
            }
            if (arrMatches[ 2 ]){
                var strMatchedValue = arrMatches[ 2 ].replace(
                    new RegExp( "\"\"", "g" ),
                    "\""
                    );
            } else {
                var strMatchedValue = arrMatches[ 3 ];
            }
            arrData[ arrData.length - 1 ].push( strMatchedValue );
        }
        return( arrData );
    }

    var locations = [
    ['Viana do Castelo', 41.6872711837914, -8.82476806640625, ],
    ['Braga', 41.54944320851238, -8.414154052734375, ],
    ['Porto', 41.15875373498798, -8.610706329345703, ],
    ['Aveiro', 40.63896734381723,-8.648300170898438, ],
    ['Vila Real', 41.30050773444147, -7.752227783203125, ],
    ['Bragança', 41.80535774441799, -6.760368347167969, ],
    ['Viseu', 40.64730356252251, -7.8936767578125, ],
    ['Guarda', 40.53258931069557, -7.25921630859375, ],
    ['Coimbra', 40.20195268954057, -8.433380126953125, ],
    ['Leiria', 39.7462660621837, -8.81103515625, ],
    ['Santarém', 39.774769485295465, -8.5693359375, ],
    ['Castelo Branco', 39.82013946676259, -7.505035400390625, ],
    ['Portalegre', 39.28860847419942, -7.42950439453125, ],
    ['Lisboa', 38.72891158257716, -9.139251708984375, ],
    ['Èvora', 38.56749535882734, -7.9046630859375, ],
    ['Setúbal', 38.5299046000139, -8.876953125, ],
    ['Beja', 38.01509916686995, -7.862606048583984, ],
    ['Faro', 37.017905231730914, -7.922515869140625, ]
    ];

    for (var i = 0; i<Parsed.length; i++){
    var a = new String(Parsed[i][0]);
    Parsed[i][0] = a.replace(/[^a-z0-9]/gi,'');
        for(var j = 0; j<locations.length; j++){
        var b = new String(locations[j][0]);
        locations[j][0] = b.replace(/[^a-z0-9]/gi,'');
            if(Parsed[i][0]==locations[j][0]){
            locations[j][3] = ((0.07*Parsed[i][2])+4.875);
            }
        }
    }

    var map = new google.maps.Map(document.getElementById('map'), {
        zoom: 7,
        center: new google.maps.LatLng(39.50, -8.37),
        disableDefaultUI: true,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    });

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

    for( var i = 0;  i < locations.length;  i++ ) {
    addMarker( locations[i] );
    }

    function addMarker( location ) {
        var lat = location[1], lng = location[2],
            magnitude = location[3], content = location[0];

        var options = {
            position: new google.maps.LatLng( lat, lng ),
            map: map
        };

        if( magnitude < 5 ) {
            options.animation = google.maps.Animation.BOUNCE;
        }
        else {
            options.icon = getCircle( magnitude );
        }

        var marker = new google.maps.Marker( options );

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

    function getCircle(magnitude) {
        return {
            path: google.maps.SymbolPath.CIRCLE,
            fillColor: 'red',
            fillOpacity: .5,
        scale: Math.pow(2, magnitude) / Math.PI,
        strokeColor: 'black',
        strokeWeight: .5
        };
    }
};
txtFile.send(null); 

  </script>
</body>
</html>

我的源代码在上面。你能帮助我吗?

提前致谢。

Update1:​​新的源代码但同样的问题。

Update2:运行Firebug,没有发现问题。

4

3 回答 3

0

尝试通过JSLint运行代码

您的主要问题是每个数组中最后一个元素后面的逗号,例如:

['Beja', 38.01509916686995, -7.862606048583984, ],

改为这样做:

['Beja', 38.01509916686995, -7.862606048583984 ],

这总是会使 IE 崩溃。JSLint 将揭示的代码还有一些其他更小的问题。

于 2013-05-03T08:58:43.090 回答
0

不是答案,只是一些信息。问题可能不在您的代码中,IE8 和 Google 应用程序(包括 Maps api)之间存在问题。Google 在去年 11 月 15 日结束了对 IE8 的支持http://support.google.com/a/bin/answer.py?hl=en&answer=33864

这个来自谷歌的简单示例页面会导致 IE8 崩溃,它会正常加载,按 F5 键会导致 IE 崩溃。https://developers.google.com/maps/documentation/javascript/examples/full/map-simple

由于这个问题,谷歌确实在 4 月 29 日推出了地图更新,增强了一些功能,导致我们实验室的夜间故障。我还没有找到解决方法或解决方法。

你需要一个; 最后: Parsed = CSVToArray(allText, ";") ?

于 2013-05-20T21:47:55.537 回答
0

其他答案对我不起作用。经过十几个想法,我最终得到了以下工作(!)解决方案:

在加载内容之前,销毁地图所附加的对象。

例如,如果您的地图设置使用:

map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);

在执行 ajax 请求之前使用此代码:

$('#map-canvas').remove();

于 2014-02-26T10:05:58.513 回答