我有以下Google地图代码。此代码的目的是显示中间带有标记的地图。该标记是可拖动的,并且在放置标记时,我需要它来提供标记放置所在的当前纬度/经度。该事件并不总是会触发。在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
。 (此外,我看不到var
的marker
语句,因此,除非您将其保留,否则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);
}
}
关于javascript - Google Maps Marker事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6270598/