jquery在*第三方ajax验证后提交*

时间:2009-10-12 08:50:40

标签: jquery forms geocoding

我有一个表单从用户那里获取地址,然后将该地址发送到我的服务器。我们的目标是使用Google的地理编码,确保在使用服务器打扰服务器之前,地址是唯一且可进行地理编码的。

我可以成功绑定form.submit,geocode,获取我的地标,确保它们是唯一的或不是..但我完全无法在回调中提交提交。这让我觉得我不应该在回调中这样做,但那就是我在这里的原因。

基本上,我需要一种方法来在表单调用上提交我的验证,这会触发回调 - 如果/当回调成功时,回调需要能够提交表单(不是AJAX帖子,谢谢)而不再触发验证。

Pseudocode跟随,从内存中输入..我已经尝试了两个.unbind('submit')。submit()并直接调用DOM提交,既没有工作,但我把它们都包括在这里为它的地狱

<html>
  <head>
    <!-- .. load google maps and jquery .. -->
    <script type="text/javascript">
      $(document).ready(function() {
        // ... insure Google, get geocoder, etc.
        geocoder = ...;

        function geocodeCallback(result) {
          // .. check if result was a success, and unique
          if (.. yes, success ..) {
            // use my not-included snazzy function to normalize the address
            $('#loc').val(normalize(result.Placemark[0]));
            $('#myform').unbind('submit');
            $('#myform')[0].submit(); // see note above
          } else {
            // do something magically useful
          }
        }

        $('#myform').bind('submit', function() {
          geocoder.getLocations($('#loc').val(), geocodeCallBack);
          return false;
        });
      });
    </script>
  </head>
  <body>
    <form id="myform" method="post" action="thispage.html">
      <input type="text" name="loc" />
      <input type="submit" name="sub" value="Submit" />
    </form>
  </body>
</html>  

2 个答案:

答案 0 :(得分:2)

基本上你需要设置一些sentinel值来表明它是有效的。例如:

<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script type="text/javascript">
num = 1;

$(function() {
  $("#form").submit(function() {
    if ($("#valid").val() == "false") {
      setTimeout(callback, 1000);
      $("#comment").text("comment " + num);
      num++;
      return false;
    }
  });
});

function callback() {
  $("#valid").val("true");
  $("#form").submit();
}
</script>
</head>
<body>
<form id="form">
<div id="comment"></div>
<input type="hidden" id="valid" name="valid" value="false">
<input type="text" name="loc">
<input type="submit" value="Submit">
</form>
</body>
</html>

值得指出的是,您不应该依赖此验证,而应该在服务器上重复此验证,因为无法阻止潜在的恶意攻击者欺骗看似有效的表单提交。

答案 1 :(得分:0)

您可以延迟表单提交决定,直到数据经过验证:

<script type="text/javascript">
      $(document).ready(function() {
        // ... insure Google, get geocoder, etc.
        geocoder = ...;

        var processingGeo = false;
        var geoResult = false;

        function geocodeCallback(result) {
          // .. check if result was a success, and unique
          if (.. yes, success ..) {
            // use my not-included snazzy function to normalize the address
            $('#loc').val(normalize(result.Placemark[0]));
            geoResult = true;
          } else {
            // do something magically useful
            geoResult = false;
          }
          processingGeo = false;
        }

        $('#myform').bind('submit', function() {
          processingGeo = true;
          geoResult = false;
          geocoder.getLocations($('#loc').val(), geocodeCallBack);
          while (processingGeo) {}
          return geoResult;
        });
      });
</script>