繁体   English   中英

提交至目标iframe的表单仅可使用一次

[英]Form submit to target iframe only works once

我在做某些我以前肯定已经做过的事情时遇到了一个非常烦人的问题。 设置是这样的:

  • 有一个表单是通过按钮上的“单击”处理程序提交的,尽管submitt最终只是对表单的本地submit()函数的简单调用。
  • 表单的目标是iframe,该iframe最初填充有一个空白页(也就是说,其源对象是空白页的URL)。 也就是说,表单的“目标”属性与iframe的“名称”和“ id”属性具有相同的标识符(是的,它是有效的标识符)(是的,它是唯一的)

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

因此,表单提交给iframe,因此服务器的响应可以是一个很小的页面,它知道它位于该隐藏的iframe中,并且知道将错误消息移至该表单。

还有一件事:表单本身也位于iframe中,作为弹出模式对话框的一部分(就像jQuery UI对话框,只是略有不同;尽管相同)。

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

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

我正在尝试建立一个稍微简单的测试用例,以查看是否可以排除一些框架代码(执行提交的工作),尽管通过一些console.log()调用我认为还可以。 在网站上的所有其他对话框等上当然可以。 当/如果我创建一个更简单的版本,我会发布它。 同时,如果你们中任何一个非常聪明的人认识到这种情况并知道使之起作用的技巧,我将非常感激。

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

好吧,我的二级“目标” iframe似乎丢失了它的“名称”属性,尽管我不知道这种情况是如何发生的,还是什么时候发生的。 <iframe>元素本身仍然具有正确的名称,但是内部的“ window”对象却不正确-即使代码正在尝试设置它。

现在,我可以通过“提交”代码检查目标表单,找到目标iframe,然后确保其contentWindow的“ name”值与“ name”属性匹配,来解决怪异问题iframe。 我不知道如何/为什么要这样做,而且我确定这是由于我做错了其他事情。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM