web-dev-qa-db-ja.com

iframeから親ウィンドウにアクセスする(クロスドメイン)

IFrameのウィンドウが別のドメインから読み込まれた場合、iFrameから親ウィンドウにアクセスするタスクに遭遇しました。私が正しく理解していれば、最近のすべてのブラウザーでこれが可能になっています。だから私は最高の解決策を見つけるためにここにいます。

次の方法でこれを達成します。

その中にiFrameを含むオーバーレイがあります。これはポップアップの代わりに機能し、ポップアップブロッカーがコンテンツをブロックするのを防ぎます。タスクは、iFrame内のドキュメントが作業を完了したときにメインページをリロードすることです。 iFrameに読み込まれるドキュメントに、追加します

<div id="is_closed" class="false"></div>

親ウィンドウで、毎秒呼び出される関数を追加し、このdivにクラス名「false」がまだあるかどうかを確認します。これが「true」に変更されると、いくつかのコールバックを呼び出します。

より良い解決策がある場合は、私と共有してください。どんな助けにも感謝します。

編集:子ウィンドウから親ウィンドウを操作するだけでなく、その逆も不可能であるため、これは不可能です。私のアイデアは、親ウィンドウから子ウィンドウを操作することでした。私は間違っていた。

10
Vitaliy Lebedev

もし私があなただったらwindow.postMessageをチェックアウトします。それはあなたが望むことをするかもしれません:

参照については、以下を参照してください。

41
jeremysawesome

私が正しく理解していれば、最近のすべてのブラウザーでこれが可能になっています。だから私は最善の解決策を見つけるためにここにいます。

これはisソリューションです。あなたが求めていることは不可能です。

関連する質問を参照してください:

[〜#〜]編集[〜#〜]

以下のコメントで述べたように、 @ JeremysAwesomeの回答 は、特定の状況下でクロスドメインリクエストを許可するメソッドを提供します。詳細については、以下のSO質問を参照してください。

同じ起源のポリシーを回避する方法

13
James Hill

ただし、srciframe属性を変更できます(#hashtagなど)、子ウィンドウでonhashchangeイベントをリッスンします。あなたが両方のページを変更する立場にあると仮定します。

7
grilly

もう1つの方法は、iframeのsrcをjavascript:リンクに設定して、ロードしてから500ミリ秒後のことです。例:

setTimeout(function() {
  document.getElementsByTagName("iframe")[0].src = `javascript: 
      (function(){
          setInterval(function() {
          if (document.getElementById("is_closed").className.match(/true/g)) {
              ...//see @jeremysawesome on how to do window.postMessage
          }
      })()`
}, 500);

@jeremysawesomeの答えは機能しましたが、これはホストドメインに関係なく埋め込みiframeで機能します。これは、blogspot.comなどのドメインでホストされているWebサイトでこのタイプを変更できない場合に最適です簡単にコンテンツ...

これで明らかにwindow.postMessageを起動する必要があります。詳細については @ jeremysawesomeの回答をご覧ください