4

次の 2 つのドメインを検討してください: domain1.com と domain2。

domain1 から、domain2 を指す iframe を開きます。

今、私はこれらの人が互いに通信できるようにしたいと考えています。これは、両方のドメインにハッシュ変更イベント リスナーを適用することで成功しました。

そうすれば、ドメイン 2 が新しいハッシュを使用して parent.location を呼び出すと、親ウィンドウ (ドメイン 1) のハッシュがトリガーされます。また、親からの I がその src 属性を新しいハッシュに変更すると、iframe でハッシュ変更イベントがトリガーされます。

これはうまくいきます!

ここで問題が発生します。

ブラウザーの前後の機能が台無しになります。簡単に言えば、2 つのハッシュ インスタンスを作成することで、最初に iframe のハッシュを循環する必要があるため、ブラウザの戻るボタンを 2 回クリックして親ハッシュを変更する必要があります。

履歴オブジェクトを台無しにすることなく、クロスドメイン iframe 双方向と通信するにはどうすればよいですか?

ありがとう!

4

2 に答える 2

7

easyXDMを使用してください。これは、IE6 を含むすべてのブラウザーでクロスドメイン通信と RPC を実行できるようにするために、すべての面倒な作業を行う JavaScript ライブラリです。

これは、現在のブラウザー (IE6 でさえも) の HashTransport を使用しないため、履歴は変更されません。

あなたはより良いものを見つけることはありません..

このScript Junkie の記事で内部の仕組みの一部を読むか、githubの readme に直接アクセスしてください。

于 2010-11-08T14:02:03.030 に答える
2

クロスドメイン通信のもう 1 つの手法は、(ab)usingwindow.nameです。最初に同じドメインの src を持つ iframe が必要です。その後、window.name を設定する別のドメインに移動してから、元のソースに戻ります (履歴に戻ります)。window.nameこれは、明示的に設定しない限り変更されないという考え方です。これは、window.nameドメイン間でデータを転送できることを意味します。


この手法については、次のサイトで詳しく説明されています。 aspx
- http://jectbd.com/?p=611

IE でクリック音を回避する実装を必ず選択してください。

残念ながら、それはまだあなたの歴史を台無しにしていますが、それは一歩前進してから、それがあった歴史のポイントに戻ります. ただし、大きな利点は、URI 文字列を解析してエンコードする必要がなく、JSON をすぐに使用できることです。

たとえば、JSON lib を使用する

// access window.name from parent frame
// note: only when iframe stepped back to same domain.
var data = JSON.parse( iframe.contentWindow.name );

// set child frame name
// note: only when iframe stepped back to same domain.
iframe.contentWindow.name = JSON.stringify( {
    foo : "bar"
} ); // to JSON string

// set own name ( child frame )
window.name = JSON.stringify( {
    foo : "bar"
} ); // to JSON string

Cookie 手法も実行可能です。どちらの手法でも、履歴の変更を避けたいが http 要求が必要な場合は、ターゲット iframe で ajax 要求を実行する必要があります。それで:

  1. データを iframe x に送信します (Cookie または window.name 手法を使用)
  2. iframe x のポーラーでデータをキャッチする
  3. iframe x で ajax リクエストを実行します。
  4. データを iframe y に送り返す (cookie または window.name 手法を使用)
  5. iframe y のポーラーでデータをキャッチする
  6. ホーキーポーキーをします。

ページの更新 (httprequest) または URL の変更によって履歴が更新されるため (IE の古いバージョンまたはすべてのバージョンを除く)、残念ながら追加のコードが必要になります。

于 2010-11-08T09:41:23.037 に答える