0

複数の行 (最大 100) を持つ HTML フォームを提供します。すべてのには、少なくとも住所フィールドがあります。(ボタンで) 実行すると、関数 ( populateFormFieldsWithLocations ) がすべてのスコープを反復処理し、google.gecoder を呼び出して結果を DOM に適用します (非表示の入力)。この後、別の関数 ( convertAndPasteJSON ) が実行されてフォームの値が取得され、シリアル化され、オブジェクトが JSON 構文に文字列化され、コピー領域に貼り付けられます。

google.geocoder は非同期タスクであるため ( $.eachはそうではありません)、現在setTimeout()を使用して 2 番目の関数の実行を少し遅くする必要があります。動作します (少なくとも 500 ミリ秒の最小遅延量を設定する場合)。

しかし、これは脆弱で満足のいくアプローチではありません。なぜなら、実行が互いに関係がないため、未知の技術環境で問題が発生する可能性があるからです。これはcallbackで処理する必要があると確信しています。しかし、この特定の例ではこれを実装できませんでしたが、多くのことを読んで試しましたが (jquery 遅延オブジェクトで遊んだ)、まだわかりません。

誰かがこれを行う方法についての短いヒントを持っていれば、とても親切です...

コード (抜粋):

function populateFormFieldsWithLocations() {

  $.each($('.row'), function() {

    // context
    var scope = $(this);

    // get routeaddress value on each context row
    var address = $('textarea#routeaddress', scope).prop('value');

    ...

    // get geocoder coords and populate form fields 
    geocoder.geocode({'address': address}, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
          var coord = results[0].geometry.location;
          $('input#lat', scope).val(coord.lat());
          $('input#lng', scope).val(coord.lng());
        }
    });    
  });
}

function convertAndPasteJSON() {
  var o = $('.convert-to-json').toObject({mode: 'combine'});
  o = JSON.stringify(o, null, 2);
  $('.convert-to-json-result .result').val(o);
}

// on dom ready
$(function() {

  $('.convert-to-json button').on('click', function(e) {

    // execute collecting data
    populateFormFieldsWithLocations();

    // execute conversion to JSON with a delay
    setTimeout("convertAndPasteJSON()", 500);

  });

});

HTML (抜粋):

<form action="." method="post" class="convert-to-json">

  <div class="row">
    <input type="hidden" name="markers[0].lat" id="lat" />
    <input type="hidden" name="markers[0].lng" id="lng" />

    <div>                               
      <label for="routeaddress">routeaddress</label>
      <textarea name="markers[0].routeaddress" id="routeaddress"></textarea>
    </div>
  </div>

  <!-- ... many more ".rows" ... -->

</form>
4

0 に答える 0