2009-05-22 10 views
1

私が取り組んでいるアプリケーションには複数のモジュールがあります。私が書いた主なモジュールとモジュールの2つが関心事です。そして、私はメインモジュールを含むウィンドウ上の関数を呼び出さなければならず、問題は親Webモジュールによって開かれたページからではなく、ユーザーがこのページからナビゲートするページからその関数を呼び出さなければならないということです。オープナー変数をページナビゲーション全体に伝播する最良の方法は?

基本的に最初のページはクエリフォームを表示し、ユーザーにクエリを実行させ、2番目のクエリ結果を保持します。これらの結果に基づいて親ページの内容を更新するはずです。

ナビゲーションはその

  • メインモジュール
  • 私のモジュールの最初のページ(私はwindow.opener変数としてメインモジュールのページを持っている。
  • 私のモジュールの2ページ目(のように行くと私はなりたいです

そして、私は可能な限り自由なナビゲーションをしたいと思っています - 開かれたクエリの結果のように私は新しいタブ、新しいクエリーパラメータの変更、新しいクエリーの作成などがあります。また、結果を表示するページにユーザークエリーフォームを表示して、このクエリーを修正してメインモジュールを更新できるようにしたいと思います。

私は、次の解決策を考えていた

:最初のウィンドウにクエリ結果をロードするためにAJAXを使用した

  1. 、私はできるだけシンプルなこのアプリを持っていると思います、とAJAXは簡単ではありません。
  2. )すべてのリクエストに新しいウィンドウを作成し、var mainModule = opener.mainModuleのようなコードを作成する。それは悪です。
  3. 埋め込みクエリの結果はフレームまたはiframeになりますが、メインモジュールのウィンドウのJavaScript変数をフレームまたはiframeに挿入する方法についてはちょっと考えました。
+0

私の回答を考えています。しかし、まず、ユーザーがこれらのタブを開くことができるようにしたいとコメントしたいと思います(最初と2番目など)。ページがタブで開かれると、ほとんどのブラウザは「オープナー」へのリンクを切断します。次に、「クエリとクエリ結果」はすべて「メイン」モジュールではなく、「自分の」モジュールから実行されますか?第3に、すべてのページは同じドメインにありますか?明確にすることができれば(できれば簡単な例の構造で)、役立つでしょう。ありがとう。 –

+0

私の「第2の」質問への答えは、すでに第2段落に記載されています。 :) –

+0

同じドメインになります。それをタブで開くことについては、要件ではありません。私はそれを動作させたいと思いますが、それは必須条件ではありません。私が考えることができるのは、新しいウィンドウで開くウィンドウオープナーを呼び出す新しいリンク「新しいタブ/ウィンドウを開く」を追加することです。 –

答えて

2

タブでナビゲートできることが必要な場合は、JavaScriptを開いたウィンドウシステムを使用するという考えをしなくてはならないと思います。 Firefox、Safari、およびほとんどのブラウザでは、別のウィンドウに移動するときにオープナーのプロパティが失われるためです。新しいタブが、きれいなサンドボックスを妨害します。

ないという要件、あなたのコメントごとに、私はあなたが3つのいずれかの方法を使用することができると思う:

  • 親子私が取り上げるウィンドウcommunication-- 次。
  • XMLHTTPリクエスト(a.k.a. AJAX);または
  • のiFrame(古い方法 にリモートサーバ:)へ

あなたが最も快適であるように見えるので、私は、ここでは、親の子通信角度を取りますよそれと。 「子」ウィ​​ンドウで

  1. 間のナビゲーションが容易です。
    • 子でページがロード上の任意のリンクと同じ「オープナー」を共有しています。
    • 親が別のページをリロードすることができますし、それは同じオープナーを共有しています。
  2. 親リスナー機能が子にあります。
  3. 子が親に話をするために別のF 慰めを持つことになります。
  4. 親には、 の一般的なニーズやニーズに応じて、1つ以上の子リスナーがあります。

私は数年前に書いた記事を更新して、あなたがウィンドウで遊んで、実際に最小限のフォーム提出をするようにしました。通信警告はかなり冗長です。誰が誰に誰と何を伝えているのかは間違いありません。最初の子供は大変うれしくオープンしています。しかし、ページには子供をサーバー生成のフォームに変更するリンクがあります。

JavaScript: Beyond Parent Child Windows


例のコードスニペット:

リンク

<a href="page1.html" id="newwinlink">open a window from link</a> 

リンクリスナー:親リスナー -

var mywin; //global variable for best results 

//XDOM - normalizes browser differences: 
var openingLink = XDOM.getElementById('newwinlink'); 
openingLink.target = "newWin"; //important! 

XDOM.addListener(openingLink, 'click', function(e){mywin=window.open('','newWin','width=400,height=400,resizable,scrollbars');if (!mywin.opener){mywin.opener = self;}return true}, false); 

子供ドキュメント:

function parentListener(pmsg) 
{ 
    alert("I'm the child, and I just received the following message from my parent:\n\n" + pmsg); 
} 

イベントリスナーとターゲットプロパティがJavaScriptでのonloadを実行している、文書の先頭に設定されています子供の文書 - 親と話す

function talktoParent() 
{ 
    if (self.opener!=null) { 
     opener.childListener("Hi from child window!"); 
    } else { 
     alert("no opener... sorry, can't talk now"); 
    } 
} 

親ドキュメント - 子供リスナー

function childListener(cmsg) 
{ 
    alert("I'm the parent. Just received the following message from my child:\n\n" + cmsg); 
    //send back a message to the child, mywin... 
    mywin.parentListener("Hi, back, from parent window!"); 
} 

これらは単純化されています。しかし、サーバー側のポストバックと上記のリンク先の親との間のオープナーの連続性、ナビゲーション、および通信を確認できます。

もう一つの欠点は、これらのいずれかを別のタブで開くと、親との接続が失われることです。私があなたに送ったページでそれを試してみてください。私は子供が "オープナー"から切断されていることを警告すると信じています。

気軽に質問してください。

0

iircは、window.openで開いたウィンドウで元のドキュメントから離れても、window.openerは引き続き使用できます。

関連する問題