質問

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

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

<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で定義されており、回避できません。

事前に感謝

役に立ちましたか?

解決

まず、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()メソッド を呼び出します。要素

他のヒント

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top