js功能很奇怪

时间:2013-01-28 13:09:59

标签: javascript html submit

我有这样的逻辑:用户在表单中给出了他的地址,我将采用这个地址并在提交功能中我将获得此地址的纬度和长度并将其保存到表单中的隐藏输入字段,然后提交形状与那些纬度和长的内部。

我的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>

问题是,当我第一次点击提交时,lat和long是空的(它们没有设置),但第二次我点击提交,它们被设置,为什么会这样?为什么不能在第一次提交电话时设置lat和long?

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

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

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

这一行必须在回调中:

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

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

答案 1 :(得分:1)

异步回调,这意味着当您调用geocodeme时,它会立即返回。在Google回复您的请求后,系统会调用回调(函数(结果,状态))。

...
            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());
}