谷歌地图标记事件

Google Maps Marker Events

本文关键字:事件 图标 地图 谷歌      更新时间:2023-09-26

我有下面的谷歌地图代码。此代码的目的是显示一个带有标记在中间的地图。标记是可拖动的,当它被丢弃时,我需要它来给出标记被丢弃的当前Lat/Long。该活动并不总是启动。在chrome中,如果我只是让代码运行,它就不起作用。但是,如果我通过调试并停止附加事件的代码来减慢速度,然后让它继续,它就可以工作了。似乎某个地方有比赛条件,但我不知道在哪里。有人能看看你有没有什么想法吗。

function initialize() {
        var myOptions = {
            zoom: 10,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        var canvas = document.getElementById("MapCanvas");
        var map = new google.maps.Map(canvas, myOptions);
        // Try W3C Geolocation (Preferred)
        if (navigator.geolocation) {
            browserSupportFlag = true;
            navigator.geolocation.getCurrentPosition(function (position) {
                initialLocation = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
                map.setCenter(initialLocation);
                marker = new google.maps.Marker({
                    position: initialLocation,
                    draggable: true,
                    map: map,
                    title: "You are here"
                });  
            }, function () {
                handleNoGeolocation(browserSupportFlag);
            });
            // Try Google Gears Geolocation
        } else if (google.gears) {
            browserSupportFlag = true;
            var geo = google.gears.factory.create('beta.geolocation');
            geo.getCurrentPosition(function (position) {
                initialLocation = new google.maps.LatLng(position.latitude, position.longitude);
                map.setCenter(initialLocation);
                marker = new google.maps.Marker({
                    position: initialLocation,
                    draggable: true,
                    map: map,
                    title: "You are here"
                });  
            }, function () {
                handleNoGeoLocation(browserSupportFlag);
            });
            // Browser doesn't support Geolocation
        } else {
            browserSupportFlag = false;
            handleNoGeolocation(browserSupportFlag);
        }

        google.maps.event.addListener(marker, 'dragend', function () {
            $("#txtLat").val(marker.position.Ia);
            $("#txtLong").val(marker.position.Ja);
        });


    }   

我还没有测试过这一点,但看起来marker是在一个getCurrentPosition函数中初始化的。我猜这两个函数都是异步的,这就是它们采用回调函数的原因。但是,您正试图将侦听器函数同步附加到marker,因此在正常情况下,您可能会尝试在初始化marker之前将侦听器附加到marker。(此外,我没有看到markervar语句,所以除非您忽略了这一点,否则marker在全局命名空间中——可能不是您想要的)。

解决此问题的方法是在初始化marker之后,在回调函数中附加侦听器。由于W3C Geolocation API和Gears API的回调看起来是相同的,因此您可能需要将所有内容放在一个函数中:

function initialize() {
    var myOptions = {
        zoom: 10,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    var map = new google.maps.Map(canvas, myOptions);
    var marker;
    // set up callback
    function initMap(initialLocation) {
        map.setCenter(initialLocation);
        // init marker
        marker = new google.maps.Marker({
            position: initialLocation,
            draggable: true,
            map: map,
            title: "You are here"
        });
        // now attach the event
        google.maps.event.addListener(marker, 'dragend', function () {
            // you know you'd be better off with 
            // marker.getPosition().lat(), right?
            $("#txtLat").val(marker.position.Ia);
            $("#txtLong").val(marker.position.Ja);
        });
    }
    // Try W3C Geolocation (Preferred)
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(function (position) {
            // call the callback
            initMap(new google.maps.LatLng(
                position.coords.latitude, position.coords.longitude
            ));
        }, function () {
            // I just assumed you weren't using 
            // browserSupportFlag anywhere else
            handleNoGeolocation(true); 
        });
    // Try Google Gears Geolocation
    } else if (google.gears) {
        var geo = google.gears.factory.create('beta.geolocation');
        geo.getCurrentPosition(function (position) {
            initMap(new google.maps.LatLng(
                position.latitude, position.longitude
            ));
        }, function () {
            handleNoGeoLocation(true);
        });
    // Browser doesn't support Geolocation
    } else {
        handleNoGeolocation(false);
    }
}