与IE8中的谷歌地图意外呼叫 [英] Unexpected call with google maps in IE8
问题描述
我使用Google地图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 UTC
消息:意外调用方法或属性访问。
行:9
char: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-typecontent =text / html; charset = UTF-8/>
< title> Google地图多个标记< / title>
< script src =http://maps.google.com/maps/api/js?sensor=false
type =text / javascript>< / script>
< / head>
< body>
< div id =mapstyle =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 old
txtFile = new ActiveXObject(Microsoft.XMLHTTP);
}
txtFile.open(GET,http://foo/f4/stats/nServsCodigoPostal.csv,true);
txtFile.onreadystatechange = function(){
if(txtFile.readyState === 4){//确保文档已准备好解析。
if(txtFile.status === 200){//确保找到了该文件。
allText = txtFile.responseText;
Parsed = CSVToArray(allText,;)
}
}
函数CSVToArray(strData,strDelimiter){
strDelimiter =(strDelimiter || );
var objPattern = new RegExp(
(
//分隔符。
(\\+ strDelimiter +| \\r?\\\\
| \\r | ^)+
//引用字段
(?:\([^ \] *(?: \\\ \\[^ \] *)*)\|+
//标准字段
([^ \\\+ strDelimiter + \\r\\\\
] *))
),
gi
);
var arrData = [[]];
var arrMatches = null;
while(arrMatches = objPattern.exec(strData)){
var strMatchedDelimiter = arrMatches [1];
if(
strMatchedDelimiter.length&& amp ;
(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,],
[ 埃武拉',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 var b = new String(locations [j] [0]);
locations [j] [0] = b.replace(/ [^ a-z0-9] / gi,''); (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();
(var i = 0; i< locations.length; i ++){
addMarker(locations [i]);
函数addMarker(location){
var lat = location [1],lng = location [2],
magnitude = location [3],content =位置[0];
var options = {
position:new google.maps.LatLng(lat,lng),
map:map
};
if(幅值<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);
});
}
函数getCircle(大小){
返回{
路径:google.maps.SymbolPath.CIRCLE,
fillColor:'red',
fillOpacity:.5,
scale:Math.pow(2,大小)/ Math.PI,
strokeColor:'black',
strokeWeight:.5
} ;
}
};
txtFile.send(null);
< / script>
< / body>
< / html>
我的源代码在上面。你可以帮助我吗?
预先感谢。
Update1:新的源代码但同样的问题。
Update2:运行Firebug,没有发现问题。 p>
其他答案对我无效。经过十几个想法之后,我最终得到了以下工作(!)解决方案:
在加载内容之前,销毁地图附加的对象。
例如如果您的地图使用以下设置:
map = new google.maps.Map(document.getElementById('map-canvas'),mapOptions) ;
在执行ajax请求之前使用此代码:
$('#map-canvas')。remove();
I'm using google map API to design a "earthquake map". So far, so good.
The map displays nicely in Firefox and Chrome but raises a error in IE8:
Webpage error details
User Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.3) Timestamp: Fri, 3 May 2013 08:13:44 UTC
Message: Unexpected call to method or property access. Line: 9 Char: 238 Code: 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>
My source code is above. Can you help me?
Thanks in advance.
Update1: New Source code but same problem.
Update2: Run Firebug, no problem was found.
The other answers did not work for me. After a dozen of ideas, I ended up with the following working(!) solution:
Before loading the content, destroy the object that the map is attached to.
e.g. if your map is set using:
map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
use this code before doing the ajax request:
$('#map-canvas').remove();
这篇关于与IE8中的谷歌地图意外呼叫的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!