2

自分のコードが特定の方法で (他の方法ではなく) 動作する理由を理解するのに苦労しています:

+----------------------------+
| jsfiddle                   |
|                            |
|              +---------+   |
|              |         |   |
|              |  jsbin  |   |
|              +---------+   |    
+----------------------------+

目標:

jsfiddle に接続しjsbin、使用してデータを返すjsbin必要があります (クロスドメイン手法)。jsfiddlewindow.name

(繰り返しますが、コードは機能しています)

jsbin's応答は次の HTML ページです。

  <script>
      window.name = 1*(new Date());
  </script>

そして、ここにコードがありますjsFiddle

/*1*/   var f;
/*2*/   
/*3*/   function loadRequest()
/*4*/   {
/*5*/       f.onload = function ()
/*6*/       {
/*7*/           alert(f.contentWindow.name);
/*8*/           frame.parentNode.removeChild(frame);
/*9*/       }
/*10*/       f.src = 'about:blank';
/*11*/   }
/*12*/   
/*13*/   $(".b").on('click', function ()
/*14*/   {
/*15*/       f = document.createElement('iframe');
/*16*/       f.name = framename = 'fetchData';
/*17*/       f.onload = loadRequest;
/*18*/       f.src = 'http://jsbin.com/AjUyoYU/8/quiet';
/*19*/       document.body.appendChild(f);
/*20*/   });

ご覧のとおり、コードは機能します: http://jsfiddle.net/7Nawt/2/

では、問題はどこにあるのでしょうか?

17 行目を見ると、 のハンドラをアタッチしてます。( )。onloadiframeloadRequest

しかし、loadRequestメソッドは - 順番に --再び (!! --line #5)関数をアタッチしonloadます。

なぜこのように機能しているのかわかりません。

つまり、常識では、loadRequestメソッドは次のようにする必要があります。

function loadRequest()
    { 
             alert(f.contentWindow.name);
             frame.parentNode.removeChild(frame);
    }

しかし、それは機能していません。

何が欠けていますか?(その他の試行は表示されます: クロスドメイン エラー)

4

1 に答える 1

3

を確認する前に、親ウィンドウにアクセスできるドメインに iframe ウィンドウを戻す必要がありますwindow.name。そうしないと、クロスドメイン エラーが発生します。そのため、それがロードされてリモート ページ セットが設定された後、同一生成元ポリシーの対象ではない にwindow.name送信し、親ウィンドウから読み取ります。about:blankwindow.name

ここでの最初のトリックはwindow.name、ウィンドウをどこに送信しても変わらないことです。したがって、ウィンドウをリモート ドメインにwindow.name送信して設定し、アクセス可能なドメインに送信してから、読み取ります。

2 つ目の秘訣は、それがとabout:blankの両方にとって幸せな環境であることです。など - クロスドメイン エラーはありません。AB

于 2013-10-21T20:34:28.227 に答える