1

私は Google Maps API を使用していくつかのコードを書いています。すべてのブラウザー (FF、IE9、Chrome) で正常に動作しますが、IE8 以下では、Map というグローバル変数にマップを割り当てました。 IE8 では Map global is null と呼ばれますが、ロケーター関数から呼び出すと addMarker 関数が機能します。以下にこれらの関数をすべて含めました。

var GoogleMaps = {};
var Map = null;
var init = (function () {
"use strict";

var MapType = null;
var ZoomLevel = null;
var ControlPos = null;
var ControlSize = null;
var myLatLong = null;

var Geocoder;
var result = null;

GoogleMaps.setup = function (options) {

    myLatLong = new google.maps.LatLng(24.886436490787712, -70.26855468754);

    if (google.loader.ClientLocation) {
        myLatLong = new google.maps.LatLng(
            google.loader.ClientLocation.latitude,
            google.loader.ClientLocation.longitude);
    } else if (options.Lat !== null && options.Long !== null) {
        options.Location = new google.maps.LatLng(options.Lat, options.Long);
    } else {
        // Else centre to UK
        options.Location = new google.maps.LatLng(52.961875, -1.419433);
    }

    if (options.MapType.toUpperCase() === 'ROADMAP') {
        MapType = google.maps.MapTypeId.ROADMAP;
    } else if (options.MapType.toUpperCase() === 'TERRAIN') {
        MapType = google.maps.MapTypeId.TERRAIN;
    } else if (options.MapType.toUpperCase() === 'HYBRID') {
        MapType = google.maps.MapTypeId.HYBRID;
    } else {
        MapType = google.maps.MapTypeId.SATELLITE;
    }

    // Check zoom level, if not set then set to zoom level 8.
    if (options.ZoomLevel) {
        ZoomLevel = options.ZoomLevel;
    } else {
        ZoomLevel = 8;
    }

    var mapOptions = {
        center: myLatLong,
        zoom: ZoomLevel,
        mapTypeId: MapType
    };

    var mapDiv = document.getElementById('canvas');
    // Map gets initiated here 
    window.Map = new google.maps.Map(mapDiv, mapOptions);

    delete options.MapType;
    delete options.Lat;
    delete options.Long;
    delete options.ZoomLevel;
};

GoogleMaps.addMarker = function (options) {
    var Location = null;
    var Animation = null;
    var Title = null;
    var Draggable = null;
    var Content = null;
    var InfoWindow = null;
    var Flat = null;
    var Clickable = null;

    if (options.lat !== null && options.long !== null) {
        Location = new google.maps.LatLng(options.lat, options.long);
        ;
    } else {
        Location = myLatLong;
    }

    if (typeof(options.position) !== "undefined") {
        Location = options.position;   
    }

    if (options.animation.toUpperCase() === 'BOUNCE') {
        Animation = google.maps.Animation.BOUNCE;
    } else if (options.animation.toUpperCase() === 'DROP') {
        Animation = google.maps.Animation.DROP;
    } else {
        Animation = google.maps.Animation.NONE;
    }

    if (options.draggable !== null && options.draggable === 'true') {
        Draggable = true;
    } else {
        Draggable = false;
    }

    if (options.title !== null) {
        Title = options.title;
    } else {
        Title = null;
    }

    if (options.content !== null) {
        Content = options.content;
        InfoWindow = new google.maps.InfoWindow({
            content: Content
        });
    }

    if (options.flat !== null && options.flat === 'true') {
        Flat = true;
    } else {
        Flat = false;
    }

    if (options.clickable !== null && options.clickable === 'true') {
        Clickable = true;
    } else {
        Clickable = false;
    }

        // Gets used in this section
        var Marker = new google.maps.Marker({
        position: Location,
        map: window.Map,
        animation: Animation,
        draggable: Draggable,
        title: Title,
        flat: Flat,
        clickable: Clickable,
        zIndex: 1
    });
    // and sets map here
    Marker.setMap(window.Map);
    if (options.content !== null) {
        google.maps.event.addListener(Marker, 'click', function (e) {
            InfoWindow.open(window.Map, this);
            google.maps.event.addListener(window.Map, 'click', function (e) {
                InfoWindow.close(window.Map, window.Marker);
            });
        });
    }
    google.maps.event.addListener(Marker, 'dragend', function (e) {
    });

    delete options.lat;
    delete options.long;
    delete options.animation;
    delete options.title;
    delete options.content;
    delete options.flat;
    delete options.draggable;
    delete options.clickable;
};

GoogleMaps.Locator = function (result) {
    var address = null;
    Geocoder = new google.maps.Geocoder();
    address = result;
    Geocoder.geocode({ 'address': address }, function (response, status) {
        if (status === google.maps.GeocoderStatus.OK) {
            window.Map.setCenter(response[0].geometry.location);
            var Location = new google.maps.LatLng(response[0].geometry.location.Xa, response[0].geometry.location.Ya);
            var markerOptions = {
                animation: "drop",
                draggable: "true",
                content: 'Hello World!',
                title: "Hello",
                position: Location
            };
            GoogleMaps.addMarker(markerOptions);
        } else {
            alert("Geocode was not successful for the following reason: " + status);
        }
    });
};

以下は、関数を呼び出す方法です。

var markerOptions = {
        lat: 52.48278,
        long: -0.892089,
        animation: "drop",
        draggable: "true",
        content: 'Hello World!',
        title: "Click Me"
    };
 google.maps.event.addDomListener(window, 'load', function () { GoogleMaps.setMarker(markerOptions) });

 google.maps.event.addDomListener(window, 'load', function () { GoogleMaps.Locator('London') });

助けてくれてありがとう。

4

4 に答える 4

2

私はこのように問題を解決しました。

<meta http-equiv=”X-UA-Compatible” content=”IE=EmulateIE7; IE=EmulateIE9″/>

于 2014-11-20T19:07:25.253 に答える
0

セットアップでこの行を変更してみてください

window.Map = new google.maps.Map(mapDiv, mapOptions);

ただ

Map = new google.maps.Map(mapDiv, mapOptions);

このようにして、宣言されたグローバル変数にアクセスします。

于 2012-08-13T13:22:51.433 に答える
0

GoogleMaps.setup はいつ呼び出されますか? 現在、ブラウザによっては、アタッチされた関数の後に呼び出すことができるように見えます

 google.maps.event.addDomListener(window, 'load', function () { ... });

そのため、addMarker を呼び出したときにマップが設定されていませんが、コールバックを受け取ったときに既に初期化されています。

Geocoder.geocode(...)

これを修正するには、GoogleMaps.setup が addMarker の前に呼び出されるようにしてください。

于 2012-08-13T14:06:17.320 に答える
-3

IE8 は常に問題を意味します。:-) セクションの先頭に次のメタ タグを追加してみてください<head>

<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />

説明はこちら:

http://blogs.msdn.com/b/ie/archive/2008/06/10/introducing-ie-emulateie7.aspx

于 2012-08-13T14:48:16.043 に答える