2011-02-22 72 views
1

我有一個頁面上有多個表單。然後我有一個按鈕,它有一個附加到它的jQuery單擊事件處理程序,它爲每個表單調用ColdFusion.Ajax.submitform()。我的問題是,submitform()僅適用於頁面上的某些表單。剩下的表單不會被保存。要注意:我可以單獨保存所有表單,因此我知道這不是我的「表單操作」代碼的問題。多次在jQuery函數中調用ColdFusion.Ajax.submitform()

<script type="text/javascript"> 
    $(function() { 
     $("#saveAll").click(function() { 
      ColdFusion.Ajax.submitForm('form1', 'multipleforms.cfm'); 
      ColdFusion.Ajax.submitForm('form2', 'multipleforms.cfm'); 
      ColdFusion.Ajax.submitForm('form3', 'multipleforms.cfm'); 
      ColdFusion.Ajax.submitForm('form4', 'multipleforms.cfm'); 
      ColdFusion.Ajax.submitForm('form5', 'multipleforms.cfm'); 
      ColdFusion.Ajax.submitForm('form6', 'multipleforms.cfm'); 
      ColdFusion.Ajax.submitForm('form7', 'multipleforms.cfm'); 
     }); 
    }); 

    location.href = 'http://localhost/multipleforms.cfm'; 
</script> 

當我刪除'location.href'行時,保存所有表單。有人知道爲什麼這條線會導致不是所有的表格都能被保存嗎? 'location.href'的原因是因爲我想刷新頁面,以便用戶可以看到依賴於他們在表單中選擇的值的數據;我不想使用'location.reload()',因爲它總是產生一個確認重載的彈出窗口。還要注意,我試圖避免使用一個大的表單來保存表單數據。

謝謝。

回答

2

這裏的問題是在Ajax中的A。您可以異步提交7個表單,但每個提交可能隨時以任意順序返回。如果表單5因爲服務器停滯而需要一分鐘才能返回,會發生什麼情況?

您將遇到的另一個問題是,瀏覽器通常允許兩個和六個同時發生的請求,因此儘管調用的異步性質,瀏覽器可能會停止等待連接。

如果您的應用程序依賴於七個表單的同時ajax提交,則一個選項是嘗試重構應用程序,以便您使用從所有有問題的表單中選擇的動態參數提交一個ajax提交。

如果這是不可能的,另一種方法是鏈接七個請求,每個請求在其前任的回調內觸發。類似這樣的:

ColdFusion.Ajax.submitForm('form1', 'multipleforms.cfm', function(){ 
    ColdFusion.Ajax.submitForm('form2', 'multipleforms.cfm', function(){ 
    ColdFusion.Ajax.submitForm('form3', 'multipleforms.cfm', function(){ 
     // etc 
    }); 
    }); 
}); 

在這裏,我們有一個提交的級聯,每個射擊時,前一個完成。如果您重定向可以直到form7提交不會發生,這重定向將是最後提交的回調中:

// forms 1 through 6, then inside the callback of form6: 
ColdFusion.Ajax.submitForm('form7', 'multipleforms.cfm', function(){ 
    location.replace('http://localhost/multipleforms.cfm'); // fires last 
}); 

隨着這可能會延遲瀏覽器的任何方法,你應該做的第一件事就是彈出微調或進度信息,以便用戶理解該應用程序正在工作。採用鏈式方法,您甚至可以在每個階段完成時更新進度條。

最後一個更蠻力的選擇是讓同步Check out the asynch argument。當然這導致重定向前的停頓,所以重構可能是從用戶體驗角度來看的最佳選擇。

+0

這比我的回答更好:)。我完全忘了Ajax.submitForm的callbackHandler參數。 – 2011-02-23 20:01:41

+0

謝謝!非常有意義。很有幫助。 – oonyalo 2011-02-25 19:52:30

0

我不是100%確定的,但我認爲它可能是submitForm通過異步請求發生的事情,所以您的location.href在所有表單實際提交和處理之前發生。嘗試改變放在location.href線這一點,並將其放置在點擊聲明中,使其最後submitForm調用之後發生的情況:

ColdFusion.Ajax.submitForm('form7', 'multipleforms.cfm'); 
window.setTimeout(function(){ 
    location.href = 'http://localhost/multipleforms.cfm'; 
}, 0); 

這應該避免放在location.href從發射前的所有以前的事件都處理。

0

您可以將asynch屬性設置爲false,以防止異步提交。

另外,如果您使用正常的jQuery ajax提交,則可以使用complete設置確保後續表單提交僅在前一個提交成功完成時纔會發生。

0

我會發布此評論,但它太長。

要清理肯和丹的代碼,你可以寫下面的腳本

(function(){ 
    var valueArray = split(commaSeparatedValueList,","); 
    for(var i=0; i<valueArray.length; i++){ 
      if((i+1) < 7)last = false; 
      else last = true; 
      submitForm('form'+(i+1), last); 
    } 
}); 
function submitForm(formid,last){ 
    ColdFusion.Ajax.submitForm(formId=formid, URL='multipleforms.cfm',asynch=false, callback=function(){ 
      if(last)location.href = 'http://localhost/multipleforms.cfm'; 
    }); 
} 

我不是JavaScript的高手,但在理論上的工作,應該的。它同步提交表單,因此您不必擔心掛機。