0

我的公司创建了一个通用应用程序,可在 iframe 中启动自定义应用程序。父窗口允许最终用户单击工作列表中的项目,并且根据他们单击的内容,我们导航到启动控制器,该控制器将建立与任务关联的产品的 URL。然后,我们将该产品应用程序加载到启动视图中的 iframe 中。

我们看到 IE 的开发人员工具中存在重复的静态内容文件(js 和部分模板)。

开发工具的图片

捆绑的js也是如此

每次加载 iframe 后,我们最终都会看到文件的额外副本。由于我们是 SPA,因此假设这些文件将被缓存(它们存在于除 IE 之外的所有浏览器中)。每个文件都由同一个 Web 服务器提供。我们甚至注意到,如果我们不在 js 文件的正确实例中设置断点,它将不会被命中。

我们已经尝试了很多事情,包括在启动控制器的销毁事件中删除 iframe(因为框架被添加到窗口对象,我们认为它永远存在)。我们确保 iframe 具有有效的 ng-src 标记,并为动态创建的 url 使用 $sce。

由于我们需要通过表单的 POST 加载 iframe,因此我们正在做类似这样的事情,这是一种提交 POST 的超级 hacky 方式。该片段不会按原样运行,但我想包含有关我们如何填充 iframe 的信息。

function launch() {
  //return launchService.launch(vm.url, buildLaunchRequest()).then(success, error);
  $timeout(function() {
    $("#productForm").submit().remove();
  }, 1);
}
launch();
<div id="launch" class="container-fluid ss-container">
  <iframe name="productFrame" id="productFrame" data-ng-src="{{vm.url}}" resize-frame />
</div>
<form id="productForm" role="form" method="post" action="{{vm.url}}" name="productForm" target="productFrame">
  <input type="hidden" name="user" ng-value="vm.user" id="user" />
  <input type="hidden" name="authToken" ng-value="vm.authToken" id="authToken" />
  <input type="hidden" data-ng-repeat="(k,v) in vm.styles" name="{{k}}" value="{{v}}" />
</form>

我确定有更好的方法来提交目标为 iframe 的表单,但目前似乎没有任何东西对我们有用。

如果有人看到这个重复的源文件问题和/或知道在加载控制器时自动提交带有生成输入的表单的正确方法,请帮助我们!

谢谢,

杰克

4

1 回答 1

1

事实证明,如果您不清除导致此问题的 iframe 上的 src 标签,IE 如何缓存 iframe 是一个奇怪的问题。

这个问题有助于确定问题: IE8 reloads dynamic iframe content from cache into the wrong iframe

每次加载角度视图时,它都会以某种方式将 iframe 的克隆添加到父窗口,而不管 src 是否相同。从我们的角度控制器中清除 src 标记$destroy似乎会让 IE 真正从 dom 中删除节点。我们甚至尝试过$("#productFrame").remove()没有任何运气。删除 src 属性也不起作用。

起作用的是$("#productFrame").attr("src", "").remove();

于 2015-04-02T18:09:29.340 回答