2009-10-12 2 views
3

У меня есть форма для получения адреса от пользователя и отправка этого адреса на мой сервер. Цель состоит в том, чтобы использовать геокодирование Google, чтобы гарантировать уникальность и геокодирование адреса до того, как он будет беспокоить его.jquery submit * после * сторонняя проверка ajax

Я могу успешно связать form.submit, geocode, получить мои метки, заверить, что они уникальны или нет .. но я совершенно неспособен сделать работу отправки в моем обратном вызове. Это заставляет меня думать, что я не должен делать это в своем обратном вызове, но именно поэтому я здесь.

В принципе, мне нужен способ отправки на вызов формы моей проверки, которая вызывает обратный вызов - если/когда этот обратный вызов будет успешным, обратный вызов должен иметь возможность отправить форму (а не сообщение AJAX, спасибо), не возобновив проверку.

Pseudocode следует, напечатанный из памяти. Я пробовал использовать оба параметра .unbind ('submit'). Submit() и напрямую обращаться к DOM submit, но не работал, но я включаю их обоих здесь в ад Это.

<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

В принципе, вам нужно установить какое-то значение дозорного, чтобы указать, что оно действительно. Например:

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

Стоит также отметить, что вы не должны полагаться на такой проверке, и вы должны повторить его на сервере, потому что нет никакого способа, чтобы остановить потенциально опасный злоумышленник от подмены, казалось бы, действительное представления формы ,

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> 
+0

Макс, не будет ваш ответ занят, подождите одну истинную яваскрипт нити? Что делать, если у меня есть другие события? Да, предполагается, что вызов геокодирования длится долго. Во всяком случае, мне нравится этот ответ, но я хотел бы понять, какой эффект от его использования будет. – Maas

+0

На самом деле, я говорил слишком рано. Мне нравится этот ответ, потому что он дал четкий способ обработки альтернативных ответов от обратного вызова. Однако, как написано, он убивает обработку javascript на Safari, как и ожидалось. – Maas