1

我正在实现一个小功能并且有点卡住。

我有一个按钮来执行一些操作,例如

<input type="submit" value="My Button" onclick="javascript:DoSomething();" />

当用户单击按钮时,将调用函数 DoSomething。

    function DoSomething()
    {
        var geocoder = new GClientGeocoder();
        geocoder.getLocations(map.getCenter(), function SetField(response)
          {
            if (!response || response.Status.code != 200) 
            {
               alert("Status Code:" + response.Status.code);
            } 
            else 
            {
                var place = response.Placemark[0];
                $('#someHiddenField')[0].value = place.AddressDetails.Country.CountryNameCode;
            }
          });
}

在函数内部定义了一个回调函数,该函数执行异步操作,将城市名称写入表单字段。问题是异步回调将在页面发布后尝试在字段中写入。有什么可以让后期处理等待回调结果的吗?回调是在 Google Maps API 中定义的,我无法避免。

提前致谢

4

2 回答 2

2

首先,您要修改 onclick 处理程序代码以包含如下 return 语句:

<input type="submit" value="My Button" onclick="javascript:return DoSomething();" />

然后修改 DoSomething 函数以返回 false ,这样如果 sumit 正在处理异步回调,它将被取消。并修改异步回调以在完成后发布表单。

function DoSomething(doPost)
{
        var geocoder = new GClientGeocoder();
        geocoder.getLocations(map.getCenter(), function SetField(response)
          {
            if (!response || response.Status.code != 200) 
            {
               alert("Status Code:" + response.Status.code);
            } 
            else 
            {
                var place = response.Placemark[0];
                $('#someHiddenField')[0].value = place.AddressDetails.Country.CountryNameCode;

                // resubmit the form here 
                $('#yourFormID').submit();
            }
          });

         return false; // cancel the submitting of the form
}

另一种方法是在您的表单中包含一个onSubmit 处理程序并使用全局标志来确定是否允许提交表单(即,如果没有异步回调仍在进行中)。当异步回调返回时,您将清除标志并从 javascript 重新提交表单,就像我在上面演示的那样,在表单元素上调用submit() 方法

于 2009-08-04T15:17:02.193 回答
0

使用常规按钮 (type="button") 而不是提交按钮,以便不发布表单。而是从回调函数发布表单。

于 2009-08-04T15:20:49.643 回答