【问题标题】:When programmatically submitting a post form, browser aborts the load of an iframe以编程方式提交表单时,浏览器会中止 iframe 的加载
【发布时间】:2013-10-15 02:14:23
【问题描述】:

我有一个看起来像这样的文档:

<iframe source="http://example.com/" style="width:100%; height:100%"></iframe>
<form action="//example.com/foo" method="post">
  <input type="hidden" name="foo" value="bar">
</form>
<script>
$(function(){
  $('form').submit();
});
</script>

这个概念是在表单提交时显示 iframe 的内容,作为插页式步骤。

问题是,当表单提交时,浏览器会中止对 iframe 源的请求,所以即使表单提交需要一段时间,iframe 仍然是空白的。

我发现将表单提交推迟 50 毫秒可以完成这项工作,但感觉很麻烦。

任何想法为什么它不会加载以及覆盖它的正确方法是什么?

【问题讨论】:

    标签: javascript html forms iframe browser


    【解决方案1】:

    如果您想等到 iframe 加载完毕,请使用:

    <script>
    $(function(){
        $('iframe').on('load', function() {
            $('form').submit();
        });
    });
    </script>
    

    或者,您可以异步发布表单,这样它就不会阻止 iframe 加载,但是您需要在 Javascript 中处理服务器响应。为此,您可能会发现此线程很有用:jQuery - Send a form asynchronously

    【讨论】:

    • 目标是提交表单并让用户尽快进入下一步,重定向到表单的操作 URL - 并在加载时显示 iframe。我不想优化显示 iframe 然后提交表单,因为它会使流程变慢。我也不能使用 ajax 发布,因为表单操作不是不同的域。
    • 那么你想要异步选项......虽然你也不能真正重定向。您可能只想将 AJAX 响应中的 HTML 拖放到页面中。你可以做类似 $('body').html(htmlFromServer);您可以使用 ajax 发布到其他域...
    • 实际上,我不是 100% 确定这会起作用,但在我的示例中,尝试将 'iframe' 替换为 document(文档周围没有引号),并将 'load' 替换为 'ready'更多。这可能会做你想做的事而没有太多麻烦......应该做的是等到当前页面“准备好”,这意味着至少页面上的所有元素都应该完成渲染,我相信不会t 强制浏览器等待 iframe 完成渲染...
    • 异步无法工作,因为:跨域xhr。湾。表单的操作位于我无法控制的不同域上。我不是在寻找解决方法,而是因为浏览器开始中止 iframe 加载的原因。
    • 啊,原因很简单……就像在页面仍在加载时单击页面上的链接一样。浏览器停止加载当前页面并开始加载新页面,因为这样效率更高。
    猜你喜欢
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    相关资源
    最近更新 更多