2011-02-22 69 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的高手,但在理论上的工作,应该的。它同步提交表单,因此您不必担心挂机。