Javascript 谷歌地图标记事件
我有谷歌地图的以下代码。这个代码的目的是在中间显示一个带有标记的地图。该标记是可拖动的,当它被丢弃时,我需要它给出标记被丢弃的当前Lat/Long。事件并不总是发生。在chrome中,如果我只是让代码运行,它就不起作用了。但是,如果我通过调试和停止附加事件的代码来降低它的速度,然后让它继续,它就会工作。似乎某个地方有比赛条件,但我不知道在哪里。谁能帮我看看你有没有什么想法Javascript 谷歌地图标记事件,javascript,google-maps,Javascript,Google Maps,我有谷歌地图的以下代码。这个代码的目的是在中间显示一个带有标记的地图。该标记是可拖动的,当它被丢弃时,我需要它给出标记被丢弃的当前Lat/Long。事件并不总是发生。在chrome中,如果我只是让代码运行,它就不起作用了。但是,如果我通过调试和停止附加事件的代码来降低它的速度,然后让它继续,它就会工作。似乎某个地方有比赛条件,但我不知道在哪里。谁能帮我看看你有没有什么想法 function initialize() { var myOptions = {
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);
});
}
我没有对此进行测试,但它看起来像是在一个
getCurrentPosition
函数中初始化的marker
。我猜这两个函数都是异步的,这就是它们采用回调函数的原因。但是,您正在尝试同步地将侦听器函数附加到标记
,因此在正常情况下,您可能正在尝试在标记
初始化之前将侦听器附加到标记
。(另外,我没有看到marker
的var
语句,因此除非您忽略了这一点,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);
}
}
我没有对此进行测试,但它看起来像是在一个getCurrentPosition
函数中初始化的marker
。我猜这两个函数都是异步的,这就是它们采用回调函数的原因。但是,您正在尝试同步地将侦听器函数附加到标记
,因此在正常情况下,您可能正在尝试在标记
初始化之前将侦听器附加到标记
。(另外,我没有看到marker
的var
语句,因此除非您忽略了这一点,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);
}
}