1

我有这个逻辑:用户在表单中提供他的地址,我将使用这个地址,在提交功能中我将获取这个地址的纬度和经度,并将其保存到表单中的隐藏输入字段中,然后使用这些提交表单里面经纬度。

我的js函数:

var geocoder = new google.maps.Geocoder();
function geocodeme(adr) {
    var address = adr;

    geocoder.geocode(
        {'address': address}, 
        function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                var latitude = results[0].geometry.location.lat();
                var longitude = results[0].geometry.location.lng();
                //alert(latitude + ' - ' + longitude);
                $('#lat').val(latitude);
                $('#long').val(longitude);
            } 
        }
    ); 
}

function submitme(){
    var adres = str + '+' + hnr + '+' + plz + '+' + stadt + '+' + land;
    var codemeadr = str + ' ' + hnr + ' ' + plz + ' ' + stadt + ' ' + land;         
    geocodeme(codemeadr);

    //document.addform.submit();
    alert($('#lat').val() + ' -- ' + $('#long').val());
}

我的表格:

....
<input type="hidden" name="lat" id="lat" />
<input type="hidden" name="long" id="long" />
<a href="javascript:submitme();"> Submit </a>

问题是我第一次点击提交时,经纬度为空(未设置),但第二次点击提交时,它们已设置,这是为什么?为什么它不能在第一次提交调用时设置纬度和经度?

顺便说一句:所有这些参数strhnr..它们确实存在并且它们不是空的,但这在这里甚至无关紧要..

感谢帮助

4

2 回答 2

2

那是因为geocoder.geocode是异步的。您必须在给它的回调中处理结果。

此行必须在回调中:

alert($('#lat').val() + ' -- ' + $('#long').val());

当然,您此时放置的任何行都不能使用正确的值。

于 2013-01-28T13:11:10.950 回答
1

异步回调,这意味着当您调用 geocodeme 时它会立即返回。在 Google 回复您的请求后调用回调 (function(results, status))。

...
            if (status == google.maps.GeocoderStatus.OK) {
                var latitude = results[0].geometry.location.lat();
                var longitude = results[0].geometry.location.lng();
                //alert(latitude + ' - ' + longitude);
                $('#lat').val(latitude);
                $('#long').val(longitude);
                document.addform.submit();
...
// call this function on button click not on submit
function submitme(){
    var adres = str + '+' + hnr + '+' + plz + '+' + stadt + '+' + land;
    var codemeadr = str + ' ' + hnr + ' ' + plz + ' ' + stadt + ' ' + land;         
    geocodeme(codemeadr);
// this function returns immediately, even when geocode is not retrieved yet.
    //document.addform.submit();
    alert($('#lat').val() + ' -- ' + $('#long').val());
}
于 2013-01-28T13:33:41.727 回答