多次在jQuery函数中调用ColdFusion.Ajax.submitform()
我有一个页面上有多个表单。然后我有一个按钮,它有一个附加到它的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()',因为它总是产生一个确认重载的弹出窗口。还要注意,我试图避免使用一个大的表单来保存表单数据。
谢谢。
这里的问题是在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。当然这将导致重定向前的停顿,所以重构可能是从用户体验角度来看的最佳选择。
我不是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从发射前的所有以前的事件都处理。
您可以将asynch
属性设置为false,以防止异步提交。
另外,如果您使用正常的jQuery ajax提交,则可以使用complete
设置确保后续表单提交仅在前一个提交成功完成时才会发生。
我会发布此评论,但它太长。
要清理肯和丹的代码,你可以写下面的脚本
(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的高手,但在理论上的工作,应该的。它同步提交表单,因此您不必担心挂机。
这比我的回答更好:)。我完全忘了Ajax.submitForm的callbackHandler参数。 – 2011-02-23 20:01:41
谢谢!非常有意义。很有帮助。 – oonyalo 2011-02-25 19:52:30