表单提交到目标iframe只能运行一次

时间:2010-04-23 19:47:34

标签: javascript jquery iframe

我有一个非常恼人的问题,我确信我以前做过的事情。设置如下:

  • 有一个表单是通过按钮上的“click”处理程序提交的,尽管提交最终是对表单的本机submit()函数的简单调用。
  • 表单的目标是iframe,最初填充空页(即,其源对象是空页的URL)。也就是说,表单的“target”属性是相同的标识符(是的,它是一个有效的标识符)作为iframe的“name”和“id”属性(是的,它是唯一的)

现在,此设置的目标如下:表单包含文件上载字段。如果上传的其中一个文件出现问题,服务器将报告错误。如果允许错误响应(即带有表单新副本的html页面以及相应的错误消息)重新加载原始窗口,则将清除文件输入字段。那不好。

因此,表单提交到iframe,以便来自服务器的响应可以是一个小页面,知道它在隐藏的iframe中,并且知道将错误消息移动到表单。

还有一件事:表单本身也在iframe中,作为弹出模式对话框的一部分(就像jQuery UI对话框一样,只是略有不同;但同样的想法)。

设置正常 - 在第一次提交时。换句话说,如果我提供好的快乐文件上传,服务器将返回成功的响应,并正确关闭对话框。如果我发送一个虚假文件,服务器会回复一个错误页面,该页面可以正确地将其内容复制到表单页面。

然而,在第二次提交时(如果我修复了虚假文件输入字段),浏览器会坚持将服务器响应发送到新的浏览器选项卡。据我所知,表单的“目标”仍然正确,iframe“name”和“id”属性没有改变,我甚至确保更新隐藏的iframe“window.name”和“window.id” “价值观。这些都没有帮助;我总是得到一个新的浏览器选项卡。

我正在尝试设置一个稍微简单的测试用例,看看我是否可以排除我的一些框架代码(提交的内容),尽管通过一些console.log()调用我认为那东西还可以;它在网站上的所有其他对话框等方面当然可以。当/如果我创建一个更简单的版本,我会发布它。与此同时,如果你们中任何一个疯狂聪明的人都认识到这种情况并且知道使其成功的诀窍,那我真的很感激。

我在Firefox(3.6)和Chrome中都看到了相同的行为,所以它必须是我的问题而不是浏览器的怪癖(好吧,至少我认为这是真的)。​​

2 个答案:

答案 0 :(得分:3)

不知怎的,我的次要“目标”iframe似乎正在失去它的“名称”属性,尽管我不知道这是怎么发生的。 <iframe>元素本身仍然具有正确的名称,但内部的“窗口”对象没有 - 即使代码正在尝试设置它。

通过对目标表单进行“提交”代码检查,查找目标iframe,然后确保其contentWindow具有与“name”匹配的“name”值,我现在能够解决这种奇怪现象。 iframe上的属性。如何/为什么我必须这样做,我不知道,我确定这是由于我做错了其他事情。

答案 1 :(得分:1)

遇到同样的问题,但表单操作是一个不同的域(提交的页面是本地html文件),因此不允许设置contentWindow.name属性。我设法通过从文档中删除iframe并使用正确的名称创建一个全新的iframe,然后再次提交表单来解决此问题。