2009-08-27 143 views
1

我有几种形式(用户可以动态添加新表单)在一个页面中,它们都被提交给相同的struts2操作。我需要在用户点击保存按钮时提交所有这些表单。

事情在FF中进展顺利。但在IE和Google chrome中,只有最后一个表单被提交。在IE和谷歌浏览器中多表单提交

任何帮助表示赞赏。谢谢。

每个窗体的元素是相同的,一个窗体构成一个对象。每个表单的数据将被添加到一个域对象中,然后该对象将被保存到数据库中。

JavaScript函数来处理保存操作:

<script type="text/javascript" > 
    function submit() { 
     var formCnt = document.getElementById('formCnt').value; 
     for(var i = 1; i <= formCnt; i++) { 
      var formName = 'form' + i; 
      document.forms[formName].submit(); 
     } 
    } 
</script> 
... 
<input type="hidden" id="formCnt" name="formCnt" value="5" /> 

<form action="add.htm" name="form1" id="form1" method="post" enctype="multipart/form-data" /> 
    <input type="text" name="item.price" id="item.price" value="" /> 
    ... 
</form> 

<form action="add.htm" name="form2" id="form2" method="post" enctype="multipart/form-data" /> 
    <input type="text" name="item.price" id="item.price" value="" /> 
    ... 
</form> 

    ... 

<form action="add.htm" name="form5" id="form5" method="post" enctype="multipart/form-data" /> 
    <input type="text" name="item.price" id="item.price" value="" /> 
    ... 
</form> 

    ... 
+0

通过“它在FF工作”我想你的意思是数据保存到数据库?你没有同时从同一个struts动作中收到所有形式的所有内容,对吗? – deceze 2009-08-27 05:52:22

+0

只有一个名为AddAction的struts动作,页面上的表单全部提交给AddAction。所以我不能在jsp页面中使用不同的字段名称,就像你在上面的html src中看到的那样。我正在考虑使用XHR尝试异步提交。希望这会起作用。感谢您的详细解答。 – user163970 2009-08-27 08:26:33

+0

您无法控制服务器端脚本?顺便说一下,投票和接受按钮是表示感谢的首选方式。 :o) – deceze 2009-08-27 12:49:34

回答

0

您应该只能够在同一时间提交一个表单。提交按钮必须位于<form>标签内,并且只应提交提交按钮所在的表单。那隐藏的input标签应该在表单标签里面以及BTW。

即使通过JS执行,submit()也会向服务器发起一个新的POST请求。你一次只能提出一个请求,这就是为什么只有最后一个出现。我不知道为什么它会在FF中工作。

如果您无论如何都需要立即提交所有内容,为何要将它分解开始?如果您需要表单中的“小节”,则可以使用<fieldset>标签。

编辑

当你运行你的脚本是一样的,如果你所有的形式有一个提交按钮,然后单击所有在提交订单的快速按钮,会发生什么。单击一个提交按钮将该表单的数据发送到POST请求中的服务器,并刷新该页面。如果您在页面刷新前快速点击另一个按钮,则可以提交另一个表单,旧请求将被取消。

我可以想象的唯一途径就是如果在触发下一个submit()之前请求恰好发送,所有形式的数据可能如何以服务器的方式到达服务器。从本质上讲,您依赖于浏览器速度很慢,或者至少在继续执行脚本之前处理请求。显然,这在FF中起作用,但在其他浏览器中失败。正如它应该。

编辑2

如果您需要提交多个字段具有相同的名称,使用一种形式,给你的领域唯一的名称。最好的命名方案取决于你的后端如何处理表单提交。

  • item0item1
  • item.0item.1
  • Model.0.itemModel.1.item
0

我相信你只能在一个时间只有一个提交 - 这可能是一个不好的做法,但如何关于基本上复制每个表单代码并将其复制到iframe中,在那里提交表单,或者依靠XHR($ .post)来模拟表单将执行的操作。

0

尝试使用document.getElementById(formId).submit();代替。 document.form.x,document.forms [int],document.forms [id]和document.x访问表单的方法不是跨浏览器兼容的引用表单的方法。

另外 - 我相信我曾经有一个问题,当我在我的表单上有一个名称和一个ID。最好的做法是使用我相信的ID。

+0

尝试getElementById,仍然无法正常工作。我正在寻找Ajax解决方案,谢谢。 – user163970 2009-08-27 08:27:57