2009-08-04 123 views
0

我正在實現一個小功能和一種卡住。等待javascript異步回調@ http post

我有一個按鈕以執行某些動作,比如

<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中定義,我無法避免。

在此先感謝

回答

1

首先,你要修改的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提交表單就像我上文演示,調用提交()方法表單元素上。

+0

錘子時間;)但它可能會拉開竅門。 – Dante 2009-08-04 15:20:22

0

使用常規按鈕(type =「button」)而不是提交按鈕,以便不發佈表單。改爲從回調函數發佈表單。