• 締切済み

openerの関係が崩れてしまった場合の関数呼び出し

javascript の関数の呼び出し方法について質問です。 A.htmlからwindow.open で開かれたB.htmlがあります。 A.htmlにある test() という関数を呼び出したいい場合、 window.opener.document.test(); となると思いますが、 B.htmlを開いている状態で、A.html上に違うページを開いたとき、 openerの関係が崩れてしまうためか、B.htmlの window.opener.document.test();  の部分で「書き込み出来ません」というスクリプトエラーが発生してしまいます。 opener を使用しないで関数を呼び出すことはできるでしょうか?

みんなの回答

  • t_netbug
  • ベストアンサー率34% (15/44)
回答No.4

何度もスイマセン。 あのあと、検証してみました。 window.opener.location.hrefでopenerのURLの取得も出来ない為、以下のように変更するとA.html内に記述された関数を実行する事が出来ます。 try{ url = window.opener.location.href; }catch(e){ window.opener.location.href = "http://******/A.html"; } window.opener.document.test();

  • t_netbug
  • ベストアンサー率34% (15/44)
回答No.3

失礼、XSS対策ではなくCSRF対策ですね。 iframeなどを使って、違うサイトの操作を乗っ取り、不正入金をさせないようにする為に実装された対策だったと思います。

  • t_netbug
  • ベストアンサー率34% (15/44)
回答No.2

こんにちは。 記憶違いかもですが、確か別ドメインに遷移した場合、opener内の関数を操作あるいは書き込みするのは今は出来なかったと思います。XSS対策だったと思います。 window.opener.location.hrefでopenerのURLは取得出来ますか? URLが取得できるのであれば、それを元に処理を挟んではいかがでしょうか? 例えば if(ドメインが違う時){ window.opener.location.href = "A.html";//元のページに戻す } window.opener.document.test(); 出来なかったらほんっとすいません。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

B.htmlからA.htmlを参照しているのに、 A.htmlがすでにないのであれば、参照のしようがないでしょ?? とりあえずA.html内のスクリプトを外部js化して、 B.htmlでも呼び出すようにしてやれば、関数自体は再利用しやすい とは思いますが、それはあくまでもA.htmlを参照しているわけでは ありませんので・・・

関連するQ&A

  • javascriptでのエラーについて

    Windows7+IE8にて以下の処理を行いたいのですが、 ================================================== (1) 親ウィンドウ(oya_window.html)から、【window.open】にて   子ウィンドウ(ko_window.html)を開く (2) 子ウィンドウ(ko_window.html)の【window.opener】にて   親ウィンドウ(oya_window.html)に定義されている   【window.open】を実行する関数[openWindow]を呼び出し、   Yahooページを開く ================================================== (2)の部分で以下のエラーとなり、Yahooページを開く事ができません。 --------------------------------------------------------- このWebページのエラーにより、正しく機能しない場合があります。 --------------------------------------------------------- タグが無効です。 oya_window.html   ライン:10 コード:0      文字:5 --------------------------------------------------------- 同マシン(Windows7)のfirefoxでは問題なく処理が行えるため、IEの 何らかの設定に起因していると思うのですが、IEの何の設定に起因して いるのかわからず、困っています。 何か情報をお持ちの方いらっしゃいましたら、よろしくお願いします。 【その他情報】 ○IEをアドオンなしで起動しても同エラーが発生することから、IEの  アドオンによる影響ではないと思われます。 ○以下の処理は問題なく実行できます。  ▼パターンA  ==================================================  (1) 親ウィンドウ(oya_window2.html)から、【window.open】にて    子ウィンドウ(ko_window2.html)を開く  (2) 子ウィンドウ(ko_window2.html)にて(元々親ウィンドウ    (oya_window.html)に定義していた)【window.open】を実行する    関数[openWindow]を呼び出し、Yahooページを開く  ==================================================  ▼パターンB  ==================================================  (1) 親ウィンドウ(oya_window3.html)から、【window.open】にて    子ウィンドウ(ko_window3.html)を開く  (2) 子ウィンドウ(ko_window3.html)の【window.opener】にて    親ウィンドウ(oya_window.html)に定義されている    【document.bgColor】を実行する関数[changeColor]を呼び出し    親ウィンドウの背景色を灰色に変更する  ================================================== 【ソース】 ▼本来のパターン ==親ウィンドウ(oya_window.html)=================== <HTML> <HEAD> <TITLE>親ウィンドウ </TITLE> <script language="Javascript"> function koopen(){ window.open("ko_window.html","ko_window","status=yes,width=800,height=100"); } function openWindow(){ window.open("http://yahoo.co.jp","",""); } </script> </HEAD> <BODY> <a href="JavaScript:koopen();">子ウインドウを開く</a> </BODY> </HTML> ================================================== ==子ウィンドウ(ko_window.html)=================== <HTML> <HEAD> <TITLE>子ウィンドウ </TITLE> <script language="Javascript"> function helpop(){ window.opener.openWindow(); } </script> </HEAD> <BODY> <a href = "JavaScript:helpop();">Yahooページを開く</a> </BODY> </HTML> ================================================== ▼パターンA ==親ウィンドウ(oya_window2.html)=================== <HTML> <HEAD> <TITLE>親ウィンドウ </TITLE> <script language="Javascript"> function koopen(){ window.open("ko_window2.html","ko_window","status=yes,width=800,height=100"); } </script> </HEAD> <BODY> <a href="JavaScript:koopen();">子ウインドウを開く</a> </BODY> </HTML> ================================================== ==子ウィンドウ(ko_window2.html)=================== <HTML> <HEAD> <TITLE>子ウィンドウ </TITLE> <script language="Javascript"> function helpop(){ window.opener.window.open("http://yahoo.co.jp","",""); } </script> </HEAD> <BODY> <a href = "JavaScript:helpop();">Yahooページを開く</a> </BODY> </HTML> ================================================== ▼パターンB ==親ウィンドウ(oya_window3.html)=================== <HTML> <HEAD> <TITLE>親ウィンドウ </TITLE> <script language="Javascript"> function koopen(){ window.open("ko_window3.html","ko_window","status=yes,width=800,height=100"); } function changeColor(){ document.bgColor="CCCCCC"; } </script> </HEAD> <BODY> <a href="JavaScript:koopen();">子ウインドウを開く</a> </BODY> </HTML> ================================================== ==子ウィンドウ(ko_window3.html)=================== <HTML> <HEAD> <TITLE>子ウィンドウ </TITLE> <script language="Javascript"> function helpop(){ window.opener.changeColor(); } </script> </HEAD> <BODY> <a href = "JavaScript:helpop();">親ウィンドウの色を変える</a> </BODY> </HTML> ==================================================

  • window.openerが設定出来ません。

    よろしくお願い致します。 親のページ(メインフレームのページ)から子ウィンドウを呼び出すことは出来るのですが、子ウィンドウから親ページを操作しようとすると、 Not Found The requested URL /test/mf_a.html/ was not found on this server. と出てしまいます。 子のスクリプトは以下の様になっています。 <!-- function aaa(){ window.opener.location.href="http://www.xxx.co.jp/test/mf_a.html/"; } function closeWin(){ if(opener.closed == false){ window.opener.close(); } window.close(); } //--> となり・・・ <img src="/test_img/shin.gif" width="150" height="53" border="0" onClick="aaa()" > を押すと親ページ(フレームのメイン)が切り替わるはずなんですが、うまくいきません。 親と子は同じ階層にいます。 どこがおかしいのでしょうか? 親が子を呼び出すときのスクリプトに問題があるのでしょうか? 教えてください。 よろしくお願い致します。

  • 別windowを開いて同じ関数を走らせたい

    別windowを開いて同じ関数を走らせたい 今回のスクリプトではブックマークレットAの形式で、あるページ(http://www.aaa?page=1&a=b)で実行すると同ドメインのpage=2,page=3・・・とブックマークレットAに定義した関数を実行しようとしています。firebugで開発をしています。 まずは、次のページ(page=今のページ+1)を開いて次のページで前のページで実行したブックマークレットAのスクリプトに定義された関数(と同じ効果のものでもOK)を実行させたいと思っています。 ---ブックマークレットAとして実行するスクリプト--- *試したコード1 function findUser(){(略)} var w=window.open(getXXXURL(++currentPage)); w.focus(); setTimeout("findUser(searchID,currentPage)",3000); →元のページでfindUserしてしまう(新しいページに適用したい) *試したコード2 function findUser(){(略)} var w=window.open(getXXXURL(++currentPage)); w.focus(); findUser(searchID,currentPage); →元のページでfindUserしてしまう(新しいページに適用したい) *試したコード3 function findUser(){(略)} var w=window.open(getXXXURL(++currentPage)); w.focus(); w.setTimeout("findUser(searchID,currentPage)",3000); →新しいページでfindUserが定義されてないのでエラー *試したコード4 function findUser(){(略)} var w=window.open(getComURL(++currentPage)); w.focus(); w.setTimeout("window.opener.findUser(window.opener.searchID,window.opener.currentPage)",3000); →元のページでfindUserしてしまう(新しいページに適用したい) このようにいろいろと試したのですが、どうにもうまくいきませんでした。 良いアイデア、例など、あなたのご意見、お待ちしております。

  • ポップアップとオープナーの関係

    オープナーはポップアップを開きます。 ポップアップにはボタンが有って、押すとopener.form1.text1.value="これが選択されました" によってオープナーのフォームに文字が入ります。 ポップアップはtarget="pop1"で開かれるので、ポップアップを閉じないままオープナーを3つ目のウインドウで開いてポップアップを表示すると、2つ目のウインドウであるポップアップが再表示され、opener.form1の部分でスクリプトエラーになります。 スクリプトエラーになる前に、そのままいくとエラーになることを検知する方法を教えてください。

  • Pythonでの関数呼び出し

    現在pythonでのプログラミングをしています。 例えば下のように関数を作るとglobal errorが発生します。 pythonでは引数で関数名を受け取らずに関数内から他の関数を呼び出すことはできないのでしょうか? よろしくお願いします。 ***************************************** def a():   b() def b():   print "test" a() *****************************************

  • ウインドウの後ろに隠れているページを前面に出したいんです。

    「呼び出し元ページ」をA 「呼び出されるWINDOWページ」をB と例えます。 「A」のリンクをクリックすると「B」がNEW WINDOWで開き、既に開いている「B」のリンクをクリックすると背面「A」が手前に来るjavascriptに挑戦しているのですが、うまく動作しないんです。 逆の順序「B」→「A」→「B」もです。 WIN IE6.0では成功しましたが、FIREFOX、ネスケ、Mac safariの最新verではダメでした。 すみません、誰か教えて頂けないでしょうか。 現在「A」「B」のページには下記の記述をしてます。 IEでは大丈夫でした。 別の方法でも良いのでお願いします。 ■「呼び出し元ページA、test1.com」 <script language="javascript"> <!-- window.focus(); //--> </script> <A href=http://www.test2.com/ target=test>リンク</A> ■「呼び出されるWINDOWページB、test2.com」 <script language="javascript"> <!-- window.focus(); //--> </script> <A href=http://www.test1.com/ target=test>リンク</A>

  • Firefoxでwindow.openerが動作しない

    あるHTMLから、window.openであらたなウィンドウを開いて、開いたウィンドウにあるリンクをクリックすると、そのリンクの値が元のウィンドウのテキストフォームに入力されるようにしたいのです。 IE6では正常に動いてくれますが、Firefox3で動きません。 新たなウィンドウでは以下の記述をしています。 function junp(value){ window.opener.formtest["test"].value = value; window.close(); } window.openerの行をコメントアウトすると正常にウィンドウを閉じます。 そもそもFirefoxでwindow.openerは使えないのでしょうか??

  • javascriptで、下記のコードをFireFoxで実行した際にd(

    javascriptで、下記のコードをFireFoxで実行した際にd("input")の行でエラーが出てしまいます。 <script language="javascript"> var a=window.alert; alert(a); a("test"); var d=document.createElement; alert(d); d("input"); </script> なぜ、window.alert関数はa変数に代入して実行できるのに、document.createElementはd変数に代入しても実行できないのでしょうか。 d変数をalertすると[native code]とアラートされるので、関数を d に代入出来てはいそうなのですが。 ちなみにFireFox3.5.11で発生した現象です。

  • IE7でのwindow.openerがnullになる

    showModalDialogで、子ウィンドウを開き、子ウィンドウからwindow.openerの関数を呼ぼうとしています。Firefoxでは、問題なく呼べるのですが、IE7ですとwindow.openerそのものがnullになってしまいます。 回避策はあるのでしょうか? IE7のバグですかね? 親 window.showModalDialog("hoge.html", this, "スタイル"); 子 var a = window.opener.hoge(); といった形で使用しています。ちなみにこの前にalert(window.opener)を入れたら、見事にnullって表示されました。

  • 親タブから子タブ開いて親タブへ戻す。

    以前、ここで質問をしたものです。 まだ、解決していません。 window.opener.focusが利かないと質問したものです。 親タブ(ウインドウ)から子タブ(ウインドウ)をひらいて そのリンク先を親タブ(ウインドウ)で制御しようとしています。 自分でいろいろやりましたが、現在chromeのみで動いています。 Firefox、IEでは動いていません。 他に良い方法はないでしょうか? 現在のコードです。 親<index.html> <html> <head> <title>TOPページ</title> <script type="text/javascript"> <!-- var win; // サブウィンドウを開く処理 function disp(url){ win = window.open(url, "oya"); } // --> </script> </head> <body> <p><a href="example_sub8.html" target="_blank" onClick="disp('example_sub8.html')">testサブウィンドウを開く</a></p> </body> </html> 子ウインドウ<example_sub8.html> <html> <head> <title>testサブウインドウ</title> <script type="text/javascript"> <!-- // リンクの処理開始 function disp(url){ if(!window.opener || window.opener.closed){ // メインウィンドウの存在をチェック window.alert('メインウィンドウがありません'); // 存在しない場合は警告ダイアログを表示 } else{ window.blur(); window.opener.focus(); window.open(url,"oya"); //window.opener.location.href = url; // 存在する場合はページを切りかえる } } // リンクの処理終了 // --> </script> </head> <body> <ul> <li><a href="#" onClick="disp('index.html'); return false;">トップページ</a></li> <li><a href="#" onClick="disp('index2.html'); return false;">test2ページ</a></li> </ul> </body> </html>

専門家に質問してみよう