JQuery представить * после * сторонней проверки AJAX - PullRequest
3 голосов
/ 12 октября 2009

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

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

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

Далее следует псевдокод, набранный из памяти. Я пробовал оба .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 ]

2 голосов
/ 12 октября 2009

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

<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 голосов
/ 12 октября 2009

Вы можете отложить отправку решения до подтверждения данных:

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