5

我们正在使用谷歌地图并发现了一个似乎只在 IE8 中发生的问题(可能在下面)。该功能在 FF、Chrome、IE9 中正常工作。

发生错误的代码是:

google.load("maps", "3.x", { other_params: "sensor=false" });
    var mapdiv = null;
    $(function () {
        mapdiv = document.getElementById("map");
        map = new google.maps.Map( mapdiv, {
            zoom: 1,
            center: new google.maps.LatLng(6, 35),
            disableDefaultUI: true,
            mapTypeId: google.maps.MapTypeId.TERRAIN
        });
        var latlngbounds = new google.maps.LatLngBounds( );

特别是在这一行:

map = new google.maps.Map( mapdiv, {
    zoom: 1,
    center: new google.maps.LatLng(6, 35),
    disableDefaultUI: true,
    mapTypeId: google.maps.MapTypeId.TERRAIN
});

错误是:

对象不支持此属性或方法

我玩过 IE 开发工具,如果我map =用类似没有任何错误的东西替换var x =,所以这让我相信该map对象是缺少某些属性/方法的罪魁祸首。虽然我真的不知道map对象来自哪里,但我认为它是从google.load调用中加载的。

有谁知道这里发生了什么?

4

1 回答 1

9

当线:

map = new google.maps.Map(mapdiv, { zoom: 1, center: new google.maps.LatLng(6, 35), disableDefaultUI: true, mapTypeId: google.maps.MapTypeId.TERRAIN });

执行后,JavaScript 解释器将开始遍历作用域链,查找map声明的位置。由于它没有在本地声明,即var map = ...,它不会在您的本地范围内找到它,并且最终会被添加到全局范围内。

在您的情况下map,已经在全局范围内定义为,因为它是您页面上window.map的 a 的 Id 。div在所有浏览器中,您都看不到错误消息,window.map将其设置为新google.maps.Map对象。出于某种原因,无论好坏,IE8 都不允许您创建名称与引用 DOM 元素的现有全局变量冲突的全局变量。

您可以通过几种不同的方式解决此问题:

  1. 创建本地var map
  2. 将您的 div 的 id 从更改map为其他内容
  3. 如果您必须map存在于全局范围内,请使用window.map =...

    (3b) 将变量名改为与 不冲突的变量名window.map,例如myMap = new google.maps.Map(...

于 2012-05-24T02:13:51.403 回答