0

私の会社では、iframe 内でカスタム アプリケーションを起動する汎用アプリケーションを作成しました。親ウィンドウを使用すると、エンド ユーザーはワークリスト内のアイテムをクリックできます。クリックした内容に応じて、タスクに関連付けられた製品への URL を作成する起動コントローラーに移動します。次に、その製品アプリケーションを起動ビュー内の iframe に読み込みます。

IE の開発者ツール内に重複した静的コンテンツ ファイル (js および部分テンプレート) が存在しています。

開発ツールのイメージ

バンドルされたjsも

iframe をロードするたびに、ファイルの追加のコピーが表示されることになります。私たちは SPA であるため、これらのファイルがキャッシュされることを前提としていました (これは、IE を除くすべてのブラウザーにあります)。各ファイルは同じ Web サーバーから提供されます。js ファイルの正しいインスタンスにブレークポイントを設定しないとヒットしないことにも気付きます。

起動コントローラー内の destroy イベントで iframe を削除するなど、さまざまなことを試しました (フレームがウィンドウ オブジェクトに追加されるため、フレームは永遠に存続すると考えられました)。iframe に有効な ng-src タグがあり、動的に作成された URL に $sce を使用していることを確認しました。

フォームから POST を介して iframe をロードする必要があるため、POST を送信するための非常にハックな方法であるこのようなことを行っています。スニペットはそのままでは実行されませんが、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 は動的な iframe コンテンツをキャッシュから間違った iframe にリロードします

srcが同じであるかどうかに関係なく、Angularビューがロードされるたびにiframeのクローンを親ウィンドウに何らかの形で追加します。angularコントローラーのsrcタグをクリアする$destroyと、IEが実際にdomからノードを削除するように見えます。$("#productFrame").remove()運がなかったとしても試してみました。src 属性を削除しても機能しませんでした。

効いたのは$("#productFrame").attr("src", "").remove();

于 2015-04-02T18:09:29.340 に答える