2009-12-10 82 views
0

我正在使用jQuery表单插件在提交表单前调用函数。 该函数调用Google Geocoder服务,该服务查找地址的坐标,并在表单中设置隐藏坐标字段的值。 似乎在beforeSubmit回调完成之前提交表单。这是正常的吗?这种形式是否应该等待beforeSubmit回调完成? 这样做的最佳方式是什么?jQuery表单插件问题

感谢

的JavaScript

$(function(){ 
    $("#submit").click(function() { 
     var options = { 
      beforeSubmit: getPosition, // pre-submit callback 
      success:  showResponse // post-submit callback    
     }; 

     // bind form using 'ajaxForm' 
     $('#addresto').ajaxForm(options); 
    }); 
}); 

function getPosition() { 

    var geocoder = new GClientGeocoder(); 

    var country = $("#id_country").val(); 
    var city = $("#id_city").val(); 
    var postal_code = $("#id_postal_code").val(); 
    var street_number = $("#id_street_number").val(); 
    var street = $("#id_street").val(); 
    var address = street_number+", "+street+", "+postal_code+", "+city+", "+country; 

    geocoder.getLatLng(address, function(point) { 
     if (point) { 
      alert(point); 
      $("#id_latitude").val(point.lat()) 
      $("#id_longitude").val(point.lng()) 
     } else { 
      alert("Geocode was not successful"); 
     } 
    }); 
    return true; 
} 

function showResponse() { 
    alert('response'); 
} 

HTML

<form id="addresto" action="" method="POST"> 

<!-- some city, country, street... fields --> 

<input type="Submit" id="submit" value="Submit" /> 
</form> 

回答

2

@ Jason的第二个解决方案几乎都在那里。

按时间顺序:

  • 与名称的形式输入LatLongAvailable缺省值为0
  • 用户输入位置信息
  • jQuery的触发关闭getLatLng()中,当getLatLng()返回的值,形式元素LatLongAvailable设置为1
  • jQuery调用一个函数开始轮询表单字段LatLongAvailable
  • 如果提交被点击,首先检查LatLongAvailabl Ë== 1,如果不是,显示等待的迹象,继续尝试每个奇数第二,如果是1,提交表单上投票

更多信息使用Javascript可以在a question I had找到。

2

相信地址解析器的getLatLng()异步调用。这意味着在继续执行return true;产品线之前,不会等待回应。

考虑到这一点,基本上有它周围的方式有两种:

  1. 你可以叫getLatLng()之前的地址的onchange事件时提交的要求不断触发,喜欢和存储的值提交。或者,
  2. 您可以添加一个标志,告诉您是否已获得地理编码响应,如果还没有,请在beforeSubmit()中输入return false;。然后,当您收到回复时,您可以从代码中触发提交。
+0

很好的答案,你正确的getLatLng()。 解决方案1有点冒失,并不完全防弹,例如,如果该功能突然出现真实情况并且用户在此之前提交,该怎么办? 我将在新的答案中阐述第二种解决方案。 – 2009-12-10 12:29:00