2009-05-14 7 views
0

私は単純なajaxアプリケーションを持っていますwindow.openerを使用している問題

これからポップアップがフォームで起動します。

フォームのresultpageとajaxアプリケーションの両方で共通のjavascriptファイルがあります。

ポップアップウィンドウのresultpageのフォームから、共通のjavascriptファイルからメソッドを呼び出して、親ウィンドウに適用しようとしています。

私のjavascriptファイルにはupdateLayerメソッドが含まれています。このメソッドは、親ウィンドウからのcaleldがうまく動作します。ポップアップウィンドウから呼び出すときに何も得られません。ポップアップウィンドウに

resultpageは、HTMLの前

<script type="text/javascript" src="x.js">window.opener.updateLayer("Layer3", "380118179930"); </script> 

を持っています。

親ウィンドウで何も起こりません。私もwindow.parentを試しました。

この理由と解決策は何ですか?

+0

David Dorwards答えは間違いなく解決策の少なくとも一部です。srcとinnertextをスクリプトに混在させることはできません。 – annakata

+0

そうです。それを混ぜないでください。ここにヘッダーにx.jsを入れる方が良いでしょう。 – Thanks

答えて

3

私はこれがthis questionに関連していると仮定し、他のユーザーからもJoshという名前が付けられています。

私の答えは、親ウィンドウに含まれるJavascriptファイルの関数がウィンドウオブジェクトにアタッチされるため、window.openerを使用して呼び出すウィンドウオブジェクトにアクセスできるそれら。

これはほとんど解決されているようですが、ここでの問題は、フォーム応答のスクリプトタグにsrc="x.js"を含めると、スクリプト内に配置されたコードを上書きすることになります。さらに、親ウィンドウにx.jsが含まれているので、ポップアップにx.jsを入れる必要はありません。

フォームの応答は次のようになりますためのコード:

<script type="text/javascript"> 
window.opener.updateLayer("Layer3", "380118179930"); 
</script> 

私は、そうでない場合は実行されてから<script></script>タグの間にコードを妨げるsrc="x.js"属性を削除しました。次

+0

ありがとうございました。 –

-3

親のhtmlファイルに新しいupdateLayer関数を作成します。別の名前に変更し、元のupdateLayerを呼び出します。例: あなたはscript要素にsrc属性を与えているので

function updateLayerPage(arg1, arg2) 
{ 
    updateLayer(arg1, arg2); 
} 

、その後、子ページ

window.opener.updateLayerPage("Layer3", "380118179930"); 
+0

これを避ける方法はありますか?その機能はいくつかの他の機能に依存しています.... –

+2

私はこれが何かを達成する理由はありません。 updateLayerPageにアクセスできる場合は、updateLayerにアクセスできますが、間接指定は何も追加しません。 – annakata

-1

から、この新しい関数を呼び出し、x.jsの結果は、JSとテキストコンテンツとして解析されますの要素は無視されます。

<script type="text/javascript" src="x.js"></script> 
<script type="text/javascript"> 
    window.opener.updateLayer("Layer3", "380118179930"); 
</script> 
+0

これを行う正しい方法は何でしょうか? –

+0

あなたがコメントしたとおり、私は答えを更新していました。 – Quentin

+0

ああ、ありがとう。私はこれをテストしていますが、親はまだ更新されていません。 –

0

同じ内容の2つのJavaScriptファイルがあり、名前空間は適用されません。

まず、親には、updateLayer()が定義されているfile.jsが含まれています。次に、親はそのfile.jsも含む子ウィンドウを開きます。それを行うと、2つのスレッドが実行されています。それぞれのスレッドは、自分の関数とオブジェクトを持っていて、別のスレッドを邪魔することはありません。私はあなたの機能がグローバルであると仮定します。これは、名前空間が使用されていない場合、問題を引き起こす可能性があります。また、あなたの大きなAjaxライブラリがiframeやそのようなものを作成し、それがボンネットの下で発生するため、それから何も表示されません。

したがって、試してください:top.window.opener.updateLayer( "Layer3"、 "380118179930");

それでも問題が解決しない場合は、含まれていないfile.jsを含む空白のウィンドウを開き、その関数をオープナーから呼び出してみてください。それがうまくいけば、そのfile.jsの内容をmyNamespace = {....大きなファイルの内容の間に....}のような名前空間にラップし、その2つのバージョンを作成するか、 2つの異なる名前空間を持つ。 JavaScriptは、しばしばあなたが思うように動作していません。

また、開かれたウィンドウのURLが正確に同じドメインのであることを確認してください。ブラウザが子ウィンドウから親ウィンドウへのアクセスを許可しないように、セキュリティの問題を引き起こす可能性があります。annakataが示唆のような機能は、まったくトリガされた場合

0

ジョシュ、

あなたが判断することはできますか?例えば。関数の最初の行に警告ボックスを置くことによって?

それ以外の場合:updateLayerはどのように定義されていますか?x.js?それは次のように定義されていた場合

function updateLayer(layer, result) { 
    // ... 
} 

...それが正常に動作する必要があります。

以下のように定義されていた場合:

var updateLayer = function(layer, result) { 
    // ... 
} 

それはは、(いずれかwindow.openerのプロパティとして利用可能であり、従ってない)windowオブジェクトのプロパティとして使用できません。 Firefoxでは、少なくとも。私はIEや他のブラウザでこれをテストしていません。

編集:なぜこの質問は「ajax」とタグ付けされていますか? AFAICSは、問題のすべてがアプリケーションのクライアント側にあります。アヤックスは関与していません。

+0

こんにちは、はい、私はTobiasが示唆したように試みましたが、私は、それはうまく動作します。私はw x.jsとwindow.parentの両方を使用して失敗したためです。 –

0

試してみてください。別の<script>タグで

parent.window.updateLayer(); 

src = some.jsとインラインスクリプトの両方で同時に動作するかどうかはわかりません。

関連する問題