1

私は小さな機能を実装していて、ちょっと立ち往生しています。

次のようなアクションを実行するボタンがあります

<input type="submit" value="My Button" onclick="javascript:DoSomething();" />

ユーザーがボタンをクリックすると、関数 DoSomething が呼び出されます。

    function DoSomething()
    {
        var geocoder = new GClientGeocoder();
        geocoder.getLocations(map.getCenter(), function SetField(response)
          {
            if (!response || response.Status.code != 200) 
            {
               alert("Status Code:" + response.Status.code);
            } 
            else 
            {
                var place = response.Placemark[0];
                $('#someHiddenField')[0].value = place.AddressDetails.Country.CountryNameCode;
            }
          });
}

関数内で、フォーム フィールドに都市名を書き込む非同期操作を実行するコールバック関数が定義されています。問題は、ページが投稿された後に非同期コールバックがフィールドに書き込もうとすることです。後処理でコールバックの結果を待機させることはできますか? コールバックは Google Maps API で定義されており、避けることはできません。

前もって感謝します

4

2 に答える 2

2

まず、onclick ハンドラー コードを変更して、次のような return ステートメントを含めます。

<input type="submit" value="My Button" onclick="javascript:return DoSomething();" />

次に、DoSomething 関数を変更して false を返すようにし、非同期コールバックで動作している場合に sumit がキャンセルされるようにします。完了したらフォームを投稿するように非同期コールバックを変更します。

function DoSomething(doPost)
{
        var geocoder = new GClientGeocoder();
        geocoder.getLocations(map.getCenter(), function SetField(response)
          {
            if (!response || response.Status.code != 200) 
            {
               alert("Status Code:" + response.Status.code);
            } 
            else 
            {
                var place = response.Placemark[0];
                $('#someHiddenField')[0].value = place.AddressDetails.Country.CountryNameCode;

                // resubmit the form here 
                $('#yourFormID').submit();
            }
          });

         return false; // cancel the submitting of the form
}

さらに別の方法として、フォームにonSubmit ハンドラーを含め、グローバル フラグを使用して、フォームの送信が許可されているかどうかを判断します (つまり、まだ処理中の非同期コールバックがないかどうか)。非同期コールバックが返されたら、フラグをクリアし、上記で示したように javascript からフォームを再送信し、フォーム要素でsubmit() メソッドを呼び出します。

于 2009-08-04T15:17:02.193 に答える
0

フォームが投稿されないように、送信ボタンの代わりに通常のボタン (type="button") を使用します。代わりに、コールバック関数からフォームを送信してください。

于 2009-08-04T15:20:49.643 に答える