【问题标题】:google maps API v3 not working in IE谷歌地图 API v3 在 IE 中不起作用
【发布时间】:2011-08-09 14:29:32
【问题描述】:

首先,我对 Javascript 和 Google Maps API 还很陌生,因此我们将不胜感激。

我正在构建一个带有多边形的地图以标记边界位置,并且能够搜索地址以查看地址所在的多边形。该代码适用于 Firefox 和 Chrome,但由于某种原因,当我尝试搜索IE 中的地址,地图只是重新加载而不是将标记放置在适当的位置。

我已经包含了我使用的所有功能。 microajax Javascript 函数用于读取包含所有多边形形状坐标的 xml 文件。由于多边形是在 IE 中渲染的,我不认为这是问题的原因,所以我没有包括它。我不知道问题可能是什么。提前致谢。

<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false"></script>
<script type="text/javascript" src="microajax.js"></script>


<style type="text/css">
html { height: 100% }
body { height: 100%; margin: 30px; padding: 0px }
#map_canvas { height: 100% }
</style>

<div id="map_canvas" style="width:800px; height:600px" text="If map is not present, this browser does not support Google Maps"></div>           

<div id="message"></div>    

<form onsubmit="showAddress()" action="#">
  <input id="search" size="60" type="text" value="" />
  <input type="submit" value="Go!" />
  <input type="button" onclick="clearmarkers();" value="Clear markers" />
</form>

</head>

<body onload="initialize()">

<noscript><b>JavaScript must be enabled in order for you to use Google Maps.</b> 
  However, it seems JavaScript is either disabled or not supported by your browser. 
  To view Google Maps, enable JavaScript by changing your browser options, and then 
  try again.
</noscript>


<script type="text/javascript">

 var gmarkers = [];
var polys = [];
var labels = [];
var glob;
var geo = new google.maps.Geocoder();
var map;  

function initialize() {           

  var ontario = new google.maps.LatLng(50.397, -85.644);
  var myOptions = {
    zoom: 5,
    center: ontario,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  }
  map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

  microAjax("xmloutput2.xml", function(data) {
  // ========= processing the polylines ===========
  var xmlDoc = xmlParse(data)
  var lhins = xmlDoc.documentElement.getElementsByTagName("lhin");
  // read each line        
  for (var a = 0; a < lhins.length; a++) {           
    var label  = lhins[a].getAttribute("name");
    var colour = lhins[a].getAttribute("colour");
    // read each point on that line
    var points = lhins[a].getElementsByTagName("point");
    var pts = [];
    for (var i = 0; i < points.length; i++) {
      pts[i] = new google.maps.LatLng(parseFloat(points[i].getAttribute("lat")), parseFloat(points[i].getAttribute("lng")));                  
    }
    var poly = new google.maps.Polygon({
      paths:pts,
      strokeColor:"#000000",
      strokeOpacity: 1,
      strokeWeight: 2,
      fillColor: colour,
      fillOpacity: 0
    });
    poly.setMap(map);
    polys.push(poly);
    labels.push(label);   
    }


 function showAddress() {
  var search = document.getElementById("search").value;
  geo.geocode( { 'address': search}, function(results, status) {
    if (status == google.maps.GeocoderStatus.OK) {
    // How many results were found
      document.getElementById("message").innerHTML = "Found " +results.length +" results";
      // Loop through the results, placing markers          
      for (var i=0; i<results.length; i++) {                                           
        var marker = new google.maps.Marker({
          map: map,
          position: results[i].geometry.location 
        });
        gmarkers.push(marker);
        glob=checkpoint(marker);                      
        if (glob == 99) {
          var infowindowoptions = {
            content: 'This address is not within a LHIN boundary'
          }
          infowindow = new google.maps.InfoWindow(infowindowoptions);

          google.maps.event.addListener(marker, 'click', function() {
            infowindow.open(map, this);
          });                          
          document.getElementById("message").innerHTML += "<br>"+(i+1)+": "+ results[i].formatted_address +" "+ results[i].geometry.location +              "Outside of Bounds";
        }
        else {
          var infowindowoptions = {
            content: 'This address is in LHIN '+labels[glob]
          }
          infowindow = new google.maps.InfoWindow(infowindowoptions); 

          google.maps.event.addListener(marker, 'click', function() {
            infowindow.open(map, this);
          });                          
          document.getElementById("message").innerHTML += "<br>"+(i+1)+": "+ results[i].formatted_address +" "+ results[i].geometry.location + 
          " - LHIN "+(glob+1)+"  "+labels[glob];
        }              
      }
      map.setCenter(results[0].geometry.location);
      map.setZoom(17)                 
    }  
    else {
      alert("Geocode was not successful for the following reason: " + status);
    }
  });
}

function clearmarkers() {
  if (gmarkers) {
    for (i in gmarkers) {
      gmarkers[i].setMap(null);
    }
  gmarkers.length = 0;
  }
}


function checkpoint(marker) {
  var LNum;
  var point = marker.getPosition();
  for (var i=0; i<polys.length; i++) {        
    if (polys[i].containsLatLng(point)) {
          Lnum = i;
          i = 999; // Jump out of loop
          }
        else {
          Lnum = 99
        }
    }
    return Lnum
};

// Polygon getBounds extension - google-maps-extensions
// http://code.google.com/p/google-maps-extensions/source/browse/google.maps.Polygon.getBounds.js
if (!google.maps.Polygon.prototype.getBounds) {
  google.maps.Polygon.prototype.getBounds = function(latLng) {
  var bounds = new google.maps.LatLngBounds();
  var paths = this.getPaths();
  var path;

  for (var p = 0; p < paths.getLength(); p++) {
    path = paths.getAt(p);
    for (var i = 0; i < path.getLength(); i++) {
      bounds.extend(path.getAt(i));
    }
  }

  return bounds;
  }
}

// Polygon containsLatLng - method to determine if a latLng is within a polygon
google.maps.Polygon.prototype.containsLatLng = function(latLng) {
// Exclude points outside of bounds as there is no way they are in the poly
var bounds = this.getBounds();

if(bounds != null && !bounds.contains(latLng)) {
  return false;
}

// Raycast point in polygon method
var inPoly = false;

var numPaths = this.getPaths().getLength();
for(var p = 0; p < numPaths; p++) {
  var path = this.getPaths().getAt(p);
  var numPoints = path.getLength();
  var j = numPoints-1;

  for(var i=0; i < numPoints; i++) {
    var vertex1 = path.getAt(i);
    var vertex2 = path.getAt(j);

    if (vertex1.lng() < latLng.lng() && vertex2.lng() >= latLng.lng() || vertex2.lng() < latLng.lng() && vertex1.lng() >= latLng.lng()) {
      if (vertex1.lat() + (latLng.lng() - vertex1.lng()) / (vertex2.lng() - vertex1.lng()) * (vertex2.lat() - vertex1.lat()) < latLng.lat()) {
        inPoly = !inPoly;
      }
    }

    j = i;
  }
}

return inPoly;
}

【问题讨论】:

    标签: javascript internet-explorer google-maps-api-3


    【解决方案1】:

    尝试摆脱表单,改为设置“Go!”的 onClick按钮显示地址()。我在 IE7、Chrome 和 Firefox 中对此进行了测试,并且成功了。

    【讨论】:

    • 感谢您的回复。我从表单中删除了 onsubmit 和 action 元素,并按照您所说的设置了 onclick,但它没有用。我最终完全删除了表单并将输入字段放在“div”标签中。干杯。
    【解决方案2】:

    您可能想尝试使用 jQuery 来运行您的初始化代码和 ajax。不要使用 body.onload,而是使用这个:

    $(function(){
      initialize();
    }) ;
    

    对于 ajax:

    $.ajax({
      url: "xmloutput2.xml",
      success: function(data){
         // handle result
      }
    });
    

    如果问题是您的表单正在提交到服务器并导致页面重新加载,您需要从 showAddress() 函数中返回 false,并使用 onsubmit="return showAddress();":

    <form onsubmit="return showAddress();" action="#">
        <input id="search" size="60" type="text" value="" />
        <input type="submit" value="Go!" />
        <input type="button" onclick="clearmarkers();" value="Clear markers" />
    </form>
    
    ...
    
    function showAddress () {
        ....
        return false ;
    }
    

    【讨论】:

    • 嗨,我加载了 Jquery 库,删除了 body.onload 函数,并用您上面的建议替换了初始化函数和 microajax 脚本,但这并没有解决问题。 Jquery 是跨浏览器脚本吗?无论如何感谢您的帮助
    • 是的,jQuery 是跨浏览器的。您能否发布您的最新代码,也许是一个示例 xmloutput2.xml 文件,以便我可以尝试重现您的问题?另外,请尝试使用 IE 开发人员工具查看控制台中是否出现任何 javascript 错误。
    • 我认为如果您不希望将表单提交到服务器并重新加载页面,则需要从 showAddress() 返回 false。
    【解决方案3】:

    尝试指定版本

    <script type="text/javascript" src="http://maps.google.com/maps/api/js?v=3.19"></script>
    

    如果您不指定版本,您将获得实验版本。发现实验版IE11有问题

    【讨论】:

      猜你喜欢
      • 2011-03-09
      • 2011-07-19
      • 2014-01-15
      • 2014-12-14
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      • 2015-03-20
      • 1970-01-01
      相关资源
      最近更新 更多