3

ユーザーからアドレスを取得し、そのアドレスをサーバーに送信するフォームがあります。目標は、サーバーに迷惑をかける前に、Google のジオコーディングを使用して、アドレスが一意でジオコーディング可能であることを確認することです。

form.submit、ジオコードを正常にバインドし、目印を取得し、それらが一意であるかどうかを確認できます..しかし、コールバックで送信を機能させることはまったくできません。これは、コールバックでそれを行うべきではないと思いますが、それが私がここにいる理由です。

基本的に、フォームで送信して検証を呼び出し、コールバックをトリガーする方法が必要です-そのコールバックが成功した場合、コールバックはトリガーせずにフォームを送信できる必要があります(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>  
4

2 に答える 2

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>

また、この検証に依存するべきではなく、サーバー上で検証を繰り返す必要があることも指摘しておく価値があります。これは、悪意のある攻撃者が一見有効なフォーム送信を偽装するのを阻止する方法がないためです。

于 2009-10-12T09:08:33.683 に答える
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>
于 2009-10-12T09:12:43.523 に答える