17

私は次のようなアプリケーションを維持しています:

ページ B を示すフレームを含むページ A があります。現在、ページ B は、別のドメイン内のまったく別の製品の一部です。

現在、彼らは、B のオプションがクリックされたときに、ページ全体が A の別のページにリダイレクトされることを望んでいます。問題は、A のwww.client.A.com/Order/Details/123URLwww.client.A.com/Order/Edit/123がフレーム B を持っているページ A はそれを知っています。

今のところ、私の解決策は AllOrders にリダイレクトすることでしたので、 client.MyCompany/Orders のようなものです

しかし、B はどちらがそれを呼び出しているのかわからないclientため (マルチテナント アプリ)、webconfig に追加します。(したがって、各クライアントには、異なる値を持つ独自の webconfig があります)。

このソリューションが最適だとは思いませんが、他に何も考えられません! ページ A に必要な URL を非表示の Div に配置して (A はすべての情報を知っているため)、B からページの DOM 全体を読み取って見つけようとしましたが、残念ながらアクセスできるのはフレーム B の DOM... (jquery で試しました)。

私はフレームが悪であることを知っていますが、これはどのように書かれているのですか...何かアイデアはありますか?

ありがとう!

4

3 に答える 3

25

親ページ A と iframe ページ B が異なるドメインにある場合、B の親プロパティを介してメソッドまたはフィールドにアクセスすることも、A のスクリプトが B のコンテンツにアクセスすることも、共有することもできません。 A と B の間のグローバル変数。ページ A とページ B の間に置かれたこの境界は、ブラウザ セキュリティ モデルの重要な部分です。これは、evil.com がオンライン バンクの Web ページをラップして、銀行の Web ページの JavaScript の内部変数を読み取るだけでアカウント情報を盗むのを防ぐものです。

最新世代のブラウザーを必要とする余裕がある場合は、こちらの他の回答のいずれかに記載されているポストメッセージ手法を使用できます。古いブラウザーをサポートする必要がある場合は、ブラウザーでクロスドメイン クライアント スクリプト技術を使用して、少量の情報を渡すことができる場合があります。この一例は、iframe を使用して外側のページ A と内側のページ B の間で情報をやり取りすることです。これは簡単ではなく、多くの手順が必要ですが、実行できます。これについては少し前に記事を書きました。

親ページ A からの B の iframe でのクリックを監視することはできません。これは、複数のレベルでブラウザーのセキュリティ ポリシーに違反しています。(ハイジャックをクリックしてください) B の URL がいつ変更されたかを確認することはできません。 iframe.src プロパティを読み取れなくなりました。

A と B が同じルート ドメインの異なるサブドメインにある場合、ドメインを共通のルートに「下げる」機会があるかもしれません。たとえば、外側のページ A がサブドメイン A.foo.bar.com でホストされ、B がサブドメイン foo.bar.com でホストされている場合、ページ A のドメインを foo.bar.com に下げることができます ( A のスクリプトでは window.domain = "foo.bar.com")。ページ A はページ B のピアとして動作し、2 つのページは必要に応じて互いのデータにアクセスできますが、技術的には A は B とは異なるドメインから提供されています。ドメインの低下に関する記事も書きました。

ドメインの低下は、ルート ドメインのコンテキストで動作するように、最も内側のサブドメインのみを剥がすことができます。A.foo.bar.com を abc.com に変更することはできません。

ドメインを共通のルート ドメインに下げることには、わずかなリスクもあります。ページを独自のサブドメインで運用する場合、html とスクリプトは、共通のルート ドメインから離れた他のサブドメインから分離されます。他のサブドメインのいずれかのサーバーが危険にさらされても、HTML ページには実際には影響しません。

ページのドメインを共通のルート ドメインに下げると、共通のルート ドメインで実行されているスクリプトと、そのドメインを共通のルートに下げた他のサブドメインからのスクリプトに内部が公開されます。他のサブドメインのいずれかのサーバーが侵害された場合、スクリプトの内部にアクセスできるため、サブドメインも侵害された可能性があります。

于 2010-04-05T05:45:10.460 に答える
7

ページとフレームが同じドメインにない場合は、ポストメッセージを使用する必要があります。同じドメイン ポリシーでは、セキュリティ上の理由から、異なるドメインのページ/フレーム間の通常の JavaScript 通信が禁止されているためです。

postmessage は html5 の一部であり、最新のすべてのブラウザー (IE8 を含む) で動作します。古いブラウザー (特に IE6/7) のサポートが必要な場合は、jQuery postmessage プラグインを使用できます(これは、古いブラウザー用の優れたハッシュタグのトリックに透過的にフォールバックします)。

補足として、フレームが悪かどうかはわかりませんが、それらに関連するいくつかの問題(ユーザビリティ、SEOなど)がありますが、いくつかの調査を行ったところ、これらのほとんどは取り組むことができると思います.

于 2010-04-04T03:57:51.930 に答える
2

JavaScript でフレーム間で通信したい場合は、'parent' を使用できます。

フレーム A に可変値がある場合、たとえば次のようになります。

var orderNo = 2;

フレーム B がそれを読み取るには、次を参照します。

var frameA_orderNo = parent.frames[0].orderNo;

(フレーム A が宣言された最初のフレームであると仮定します)

したがって、他のフレームが読み取ることができる各フレーム内にグローバル変数を設定できるため、古い形式の javascript で # 順序を取得できます (jquery では試したことはありません)。

うわーフレーム - 私がそれらについてもう一度考えるとは思わなかった.

于 2010-04-03T00:16:50.950 に答える