プロが教えるわが家の防犯対策術!

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 を使用しないで関数を呼び出すことはできるでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (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();
    • good
    • 0

失礼、XSS対策ではなくCSRF対策ですね。


iframeなどを使って、違うサイトの操作を乗っ取り、不正入金をさせないようにする為に実装された対策だったと思います。
    • good
    • 1

こんにちは。


記憶違いかもですが、確か別ドメインに遷移した場合、opener内の関数を操作あるいは書き込みするのは今は出来なかったと思います。XSS対策だったと思います。

window.opener.location.hrefでopenerのURLは取得出来ますか?
URLが取得できるのであれば、それを元に処理を挟んではいかがでしょうか?
例えば
if(ドメインが違う時){
window.opener.location.href = "A.html";//元のページに戻す
}
window.opener.document.test();
出来なかったらほんっとすいません。
    • good
    • 0

B.htmlからA.htmlを参照しているのに、


A.htmlがすでにないのであれば、参照のしようがないでしょ??

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

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qopenerは使えないのでしょうか?

以下の操作をした際に親ウインドウの情報を取得できず困っています。
1.親ウインドウでサブウインドウを開く
2.サブウインドウのボタン押下で親ウインドウのlocationを変更する
3.サブウインドウから「window.opener」を使おうとすると、object自体は存在するがnameやdocumentが取得できない

サブウインドウが開いている間に親ウインドウを変更するとopenerは情報を失うのでしょうか?

やりたいことはサブウインドウから親ウインドウのアドレスを変更し、hiddenに値をセットしたいのですが、対応策はありますでしょうか?

よろしくお願いします。

Aベストアンサー

隠しフレームを用意します。
親ウインドウを開く際、隠しフレームのjavascriptから開くようにします。
子ウインドウも開く際、隠しフレームのjavascriptから開くようにします。
子から親ウインドウを更新する場合は、隠しフレームのjavascriptで更新をかけます。
また、hiddenに値を入れる際にも隠しフレームのjavascriptで、、。
こんな感じでやれば、出来ると思います。

ちなみに隠しフレームって、0ピクセルのフレームの事です。

Qエラー:書き込みができません が出てしまいます

フレーム(rightup) が表示しているURLを調べて表示させるJavaScriptを書きました。rightupの表示内容が初期状態のときは動きます。ところが、初期状態と異なるURLを表示させると以下のようなエラーが出てしまいます。

エラー:書き込みができません

以下、フレーム定義のHTML、URLを調べて表示させるJavaScriptの含まれているHTMLの抜粋を示します。
理由等お分かりの方教えていただけないでしょうか。よろしくお願いします。

フレーム定義のHTML(抜粋)

<FRAMESET cols="59%,41%">
<FRAME src="left.html" name="left" id="left">
<FRAMESET rows="85%,15%">
<FRAME src="right_up.html" name="rightup" id="rightup">
<FRAME src="right_bottom.html" name="rightbottom" id="rightbottom">
</FRAMESET>
<NOFRAMES>
<BODY>
<P>このページを表示するには、フレームをサポートしているブラウザが必要です。</P>
</BODY>
</NOFRAMES>
</FRAMESET>


JavaScriptの含まれているHTML(抜粋)

<HTML>
<HEAD>

<META http-equiv="Content-Style-Type" content="text/css">
<TITLE></TITLE>
<SCRIPT LANGUAGE = "JavaScript">
<!--
function ShowProperty()
{top.rightbottom.document.write(window.top.rightup.location.href)}
//-->
</SCRIPT>
</HEAD>
<BODY>
<CENTER>
<FORM NAME = "fom">
<INPUT TYPE="button" value="GO" onclick=ShowProperty()>
</FORM>
</CENTER>
<TABLE border="1" width="100%">
<TBODY>
<TR><TD><A href="http://www.asahi.com" target="rightup">朝日</A></TD></TR>
<TR><TD><A href="http://www.yahoo.co.jp" target="rightup">Yahoo</A></TD></TR>
</TBODY>
</TABLE>
</BODY>
</HTML>

フレーム(rightup) が表示しているURLを調べて表示させるJavaScriptを書きました。rightupの表示内容が初期状態のときは動きます。ところが、初期状態と異なるURLを表示させると以下のようなエラーが出てしまいます。

エラー:書き込みができません

以下、フレーム定義のHTML、URLを調べて表示させるJavaScriptの含まれているHTMLの抜粋を示します。
理由等お分かりの方教えていただけないでしょうか。よろしくお願いします。

フレーム定義のHTML(抜粋)

<FRAMESET cols="59%,41%">
<FRAME src="lef...続きを読む

Aベストアンサー

window.top.rightup.location.hrefのhrefは単純なストリングではなくオブジェクトです。document.write(Object)はできないのでエラーが発生しました。

下記のようにすればいけるはずだと思います:
top.rightbottom.document.location = "right_bottom.html"

Qwindow.openがIEでエラーにされる

こんにちは。

今作成中のサイトで、地図印刷用ページをポップアップ表示させるため、以下のようなコードをつくりました。

html側
<a href="javascript:printwindow('map_print.html');">

js側
function printwindow(url){
window.open(url,document.title,"width=640,height=850,left=0,top=0,scrollbars=1,resizable=1");
}

しかし、これではFirefoxでは新ウィンドウがエラーなしで表示されたのですが、IEでは「ページでエラーが発生しました」と言われ、ウィンドウが開きません。エラー内容は以下の通りです。

ライン:4
文字:2
エラー:引数が無効です。
コード:0
url:(エラーを起こしたファイル)

色々と試したり、検索したりもしたのですが原因究明に至れないため質問いたします。window.openがIEではなにか問題がありそうな気配だけはわかった気がします(的外れなのかもしれませんが)。原因をお教えいただけますと大変助かります。よろしくお願い致します。

こんにちは。

今作成中のサイトで、地図印刷用ページをポップアップ表示させるため、以下のようなコードをつくりました。

html側
<a href="javascript:printwindow('map_print.html');">

js側
function printwindow(url){
window.open(url,document.title,"width=640,height=850,left=0,top=0,scrollbars=1,resizable=1");
}

しかし、これではFirefoxでは新ウィンドウがエラーなしで表示されたのですが、IEでは「ページでエラーが発生しました」と言われ、ウィンドウが開きません。エラー内容は以...続きを読む

Aベストアンサー

> htmlファイルとの差といえば、<title>タグが無題ドキュメントか正式名か、

これが原因な気がします。window.openの第二引数で使用できない文字を設定しているのではないかと。具体的に何が駄目かは分かりませんが、例えば「\」とかをタイトルに入れるとエラーが発生しました。

Q子→親ウインドウへデータを受け渡し、子ウィンドウを閉じる。

このような処理はできないでしょうか?

子ウィンドウはコード番号の検索用。該当のコードのリンクをクリックすると、そのコード番号を親ウィンドウのテキストボックスへ落とし込む。そのタイミングで、子ウィンドウは閉じる。
子→親ウインドウへのデータの受け渡しと、子ウィンドウのクローズを同時に行うようなイメージです。
よろしくお願いします。

Aベストアンサー

こんにちは

【親ウィンドウ】
<form action="xxx.php" method="POST" name="myForm">
顧客コード
<input type="text" name="kokyaku_cd" size="10">
<a href="javascript:void(0)" onClick="window.open('search.html','search','menubar=no,height=400,width=300');">検索</a>
</form>

【子ウィンドウ】
<script language="javascript"><!--
function ich(n) {
window.opener.document.myForm.kokyaku_cd.value=n;
window.close();
}
//--></script>

<table>
<tr>
<th>顧客コード</th>
<th>顧客名称</th>
</tr>
<tr>
<td><a href="javascript:ich('ABC商店')">0001</a></td>
<td>ABC商店</td>
</tr>
<tr>
<td><a href="javascript:ich('DEF商店')">0002</a></td>
<td>DEF商店</td>
</tr>
</table>

もしくはNo.1様の言うようにidを設定して
【親画面】
<input type="text" name="kokyaku_cd" size="10" id="kokyaku_cd">

【子画面 function内】
window.opener.document.getElementById("kokyaku_cd").value=n;

でできると思います

こんにちは

【親ウィンドウ】
<form action="xxx.php" method="POST" name="myForm">
顧客コード
<input type="text" name="kokyaku_cd" size="10">
<a href="javascript:void(0)" onClick="window.open('search.html','search','menubar=no,height=400,width=300');">検索</a>
</form>

【子ウィンドウ】
<script language="javascript"><!--
function ich(n) {
window.opener.document.myForm.kokyaku_cd.value=n;
window.close();
}
//--></script>

<table>
<tr>
<th>顧客コード</th>
<t...続きを読む

Q子ウィンドウの存在確認

子ウィンドウが開いていない場合にのみ子ウィンドウを開くような下記の処理があるとします。

function OpenSubWindow()
{
if(!w.closed()){
alert('閉じろ!');
}else{
w = window.open("a.html","sub","resizable=no,scrollbars=no");
}
}

この場合、当然のことですが、変数wはelseの中で初めて初期化されるため、ifの条件でオブジェクトが存在しないことによりエラーが発生します。

でも、"sub"というname属性のウィンドウが開いているかどうかを確認したいのですが、どうすればよいのでしょうか?wを初期化する方法が何かあるのでしょうか?それとも、subウィンドウのopen/closeの状態を管理するロジックを作りこまないといけないのでしょうか?

Aベストアンサー

細かなロジックを考える必要はありませんよ。
w がオブジェクトかどうか分からない時点で w.closed を評価するのがマズイだけですから、評価の順番を変えればいいんです。

var w;
function OpenSubWindow() {
  if (!w || w.closed)
    w = window.open("a.html", "sub", "resizable=no,scrollbars=no");
  else
    alert("閉じろ!");
}

ちなみに closed はメソッドではなくプロパティですので、w.closed() ではエラーとなります。
また、既に開いているときの処理は
  w.focus();
とすれば子ウィンドウがアクティブになるのでオススメです。

Qwindow.openerを使っての操作

JavaScript初心者です。

JavaScriptのwindow.openerを使って、
子ウィンドウから親ウィンドウに値を渡す、
ということをしたいのですが、うまくできません。
実装したい環境はIE6です。。

こちらのページのサンプルにあるソースをそのまま貼り付けてみても動きませんでした。
http://shoyu-ramen23.jugem.jp/?eid=203
ただ、サンプルはこちら、と書いてあるページのものは動きます。
(実際記載されているソースとは違うのではないかと思いますが)
 *ちなみにGoogleChromeでも同じ結果でした。ソース自体何か誤りがあるのでしょうか

サンプルのように子ウィンドウにある選択肢を一つクリックすると
その値が親ウィンドウの特定のテキストエリアに渡される
・・というものすらうまくできないのですが、

子ウィンドウでチェックボックス式の選択肢を用意して、
子ウィンドゥ側で「選択」等の決定ボタンが押されたときに、チェックが入っている選択肢の内容が
カンマで区切られて親ウィンドウのテキストエリアに渡される・・・
というものを作成したいのです。
 子ウィンドウチェックボックスで、りんごとみかんとバナナにチェックが入っていれば
 親ウィンドウのテキストエリアには「りんご,みかん,バナナ」といったふうにです。

こういったものは作成できるものなのでしょうか。
それともJavaScriptでやるようなことではないのでしょうか。
JavaScriptでできる場合どのようにすればよいのでしょうか?

せめてサンプルだけでも動かせるようにしたいです。。
他にもいろいろと試してみましたがどうにも動きません・・
よろしくお願い致します。

JavaScript初心者です。

JavaScriptのwindow.openerを使って、
子ウィンドウから親ウィンドウに値を渡す、
ということをしたいのですが、うまくできません。
実装したい環境はIE6です。。

こちらのページのサンプルにあるソースをそのまま貼り付けてみても動きませんでした。
http://shoyu-ramen23.jugem.jp/?eid=203
ただ、サンプルはこちら、と書いてあるページのものは動きます。
(実際記載されているソースとは違うのではないかと思いますが)
 *ちなみにGoogleChromeでも同じ結果でした。ソース自体何か...続きを読む

Aベストアンサー

<html>
<head>
<title>子ウィンドウ</title>
<script>
function setFormInput(val){
  if(!window.opener || window.opener.closed){
    //親ウィンドウが存在しない
    window.close();
  } else{
    //window.openerで親ウィンドウのオブジェクトを操作
    window.opener.document.getElementById('title01').innerHTML = val;
    window.opener.document.form01.text01.value = val;
    window.close();
  }
}

function OC(){
var d=document.getElementsByTagName("input")
var a=[]
for(var i=0;i<d.length;++i){
if(d[i].checked){a.push(d[i].nextSibling.textContent)}
}
setFormInput(a.join())
}
</script>
</head>
<body>
好きな果物を選んで下さい。<br>
<input type="checkbox">いちご<br>
<input type="checkbox">りんご<br>
<input type="checkbox">みかん<br>
<input type="button" value="選択" onClick="OC();window.close();return false;">
</body>
</html>

<html>
<head>
<title>子ウィンドウ</title>
<script>
function setFormInput(val){
  if(!window.opener || window.opener.closed){
    //親ウィンドウが存在しない
    window.close();
  } else{
    //window.openerで親ウィンドウのオブジェクトを操作
    window.opener.document.getElementById('title01').innerHTML = val;
    window.opener.document.form01.text01.value = val;
    window.close();
  }
}

function OC(){
var d=document.getElementsByTagName("inpu...続きを読む

Qwindow.openで値の渡し方を教えてください。

画像をクリックするとwindow.htmlで新しいウインドウが開き、「IMG/AAA.jpeg」という値をwindow.htmlに渡して、画像を表示したいのですが、どのようにすればよいでしょうか。

画像をクリック(photoOpnに値が渡される)→関数photoOpn実行(window.htmlに値が渡される)→window.html表示(値を受け取り画像を表示)といった具合にしたいのですが・・・。

<html>
<head>
<script type="text/javascript"><!--
photoOpn(value){
window.open("window.html");
}
//--></script>
</head>

<body>
<a href="javascript:photoOpn('IMG/AAA.jpeg')"><img src="IMG/AAA.jpeg"></a>
</body>

ここまではやってみたのですが、window.htmlにどのように値を渡せばいいのでしょうか。

Aベストアンサー

>>1
> 結構複雑になってしまいますね。Javascriptを勉強してまもないので
> 難しく感じてしまいます(笑)
> 図々しいとは思いますが、少しながら関数等のscriptの説明をして
> 頂けませんでしょうか。

すみませんでした。
自分でやるときもなかなかコメントつける癖がなくて暫く経ったら
自分の書いたコードさえ解読できなくなることが多々あったりします。
それでも、コメント書くのが面倒だったりそもそも適切なコメントが
思い浮かばずつい、省略してしまうことが多くて自分でも困っていたり
します。(^_^;

やっていること自体は決して複雑ではないはずなんですけど、確かに
難しいかも知れませんね。

// URL エンコード
url = encodeURIComponent(url);

これはURLエンコードしています。
クエリに非ASCII文字列などを含めるときはURLエンコードします。
スラッシュはディレクトリ区切りとしても使用されているのでURLと
しては使用可能ですが念のためにURLエンコードしています。
因みにJavaScriptにはURLエンコードする関数がいくつかありますが
スラッシュをエンコードできるのは上記の関数のみのようです。
また、日本語などの文字列が含まれる場合、元の文字列が何であっても
強制的にUTF-8としてURLエンコードしてしまいますのでご注意ください。

window.open('window.html?url=' + url);

これはそのまま、URLにクエリを追加して渡しているだけです。

var query = location.search.substr(1).split('&');

ここが一番分かりにくい可能性がありますが

location.search

はURLのクエリの部分(?含む)を文字列オブジェクトとして返します。

.substr(1)

は1文字目(?を飛ばす)移行を取得しています。

.split('&')

は '&' を区切りとして分割し配列として返します。
(念のため複数のクエリが渡されたときを考慮して)

var base = './';

これは画像ファイルのURLパスです。
相対パスと絶対パスどちらも指定できます。
最後は必ずスラッシュで終わってください。

if(query != '') {

これはクエリがから文字列でなかったらという条件文です。
この条件に一致したらこれ以降のブロックを実行します。

var req = new Array();
for(var i = 0; i < query.length; i++) {
var key = query[i].split('=');
req[decodeURIComponent(key[0])] = decodeURIComponent(key[1]);
}

ここは、各クエリを連想配列に代入しています。
ここはPerlCGIなどで使用されている部分をそのままJavaScriptに
移植してみました。
代入するときにキーと値の両方をURLデコードしています。

var img = document.createElement('img');
img.setAttribute('src', base + req['url']);
document.getElementById('img').appendChild(img);

ここは img エレメントを作成し、 'img' のIDをもつエレメントの
子要素として作成した img エレメントを追加しています。

あと、うっかり忘れていて説明している段階で気がついたのですが
上記のコードの前に req['url'] があるかどうか調べないとエラーが
でる可能性が...。

説明が下手なので却って分かりにくいかも知れませんがご了承ください。
かくコード部分の詳細はネットで調べた方が早くてもっと分かりやすく
説明している所があると思いますよ。
(そもそも上記はほとんどネットから集めた情報を組み合わせただけ
ですので)

>>1
> 結構複雑になってしまいますね。Javascriptを勉強してまもないので
> 難しく感じてしまいます(笑)
> 図々しいとは思いますが、少しながら関数等のscriptの説明をして
> 頂けませんでしょうか。

すみませんでした。
自分でやるときもなかなかコメントつける癖がなくて暫く経ったら
自分の書いたコードさえ解読できなくなることが多々あったりします。
それでも、コメント書くのが面倒だったりそもそも適切なコメントが
思い浮かばずつい、省略してしまうことが多くて自分でも困っていたり
しま...続きを読む

Qウィンドウ名からウィンドウオブジェクトを取得

対象ブラウザはIE6~8です。
2つのウィンドウA/Bが連動するプログラムを作っています。

ウィンドウAにはウィンドウBを開くためのボタンがあり、
Aより先にBが開くことはありません。必ずAからBが派生します。

Aはwindow.openの戻り値を保持することで、B内部のJavaScriptにアクセスします。
Bはwindow.openerプロパティを経由することで、A内部のJavaScriptにアクセスします。

しかし、Aには自身をリロードする機能があり、
リロードすると保持していたBのウィンドウオブジェクトを失ってしまいます。
そこでAがリロードし終わったとき(onloadのタイミング)に、
何とかしてBのウィンドウオブジェクトを取得しなければなりません。

window.openではウィンドウに名前を付けることができますが、
その名前からウィンドウオブジェクトを取得するような、
document.getElementByNameみたいなメソッドは存在しないでしょうか?

あるいは、BからAの監視を続け、リロードが終わった時に
window.opener経由でメッセージを送る等の処理を実現する手段はないでしょうか?

よろしくお願い致します。

対象ブラウザはIE6~8です。
2つのウィンドウA/Bが連動するプログラムを作っています。

ウィンドウAにはウィンドウBを開くためのボタンがあり、
Aより先にBが開くことはありません。必ずAからBが派生します。

Aはwindow.openの戻り値を保持することで、B内部のJavaScriptにアクセスします。
Bはwindow.openerプロパティを経由することで、A内部のJavaScriptにアクセスします。

しかし、Aには自身をリロードする機能があり、
リロードすると保持していたBのウィンドウオブジェクトを失ってしまいます。
そこでA...続きを読む

Aベストアンサー

>あるいは、BからAの監視を続け、リロードが終わった時に
>window.opener経由でメッセージを送る等の処理を実現する
>手段はないでしょうか?
簡単なテストをしてみましたが、できないことはなさそう。
ただし、いろいろな可能性があるので、それにちゃんと対処しようとすると少々面倒そうな気が…

以下、正常な処理の場合。
1)AのunloadイベントでBの関数を呼び出す。
2)Bの関数からsetTimeoutなどでBの監視関数を呼び出す。
3)Bの監視関数はopenerのreadyStateがcompleteになるまで、自分自身をsetTimeoutなどで呼ぶ。
4)completeを確認したら、opnerの受取り用関数にB自身を引数で送る。

単純に予定通りの操作しかなければ(↑)で再取得できるみたいですが、実際は、Bが手動で閉じられていたりAが別のサイトにジャンプする(unloadイベントなので)などなどその他のケースも考えると、けっこう面倒そうです。


別のアイデアとして…
・Aから同じ名前でBを開き直せば(多分、名前を付けているでしょうから)、Bを再取得することが可能です。
・それなので、Bを開いているか否かをクッキーに保存しておいて、それを確認してAのload時にBを開くかを決めることにしてあげればよさそう。
・Bが別のサイトに遷移したりクローズされたりする場合を考えると、Bのunloadでクッキーを書きかえる。
・Bのリロードも考慮するなら、loadでクッキーへ書込む必要があり、結局は、クッキーの書込みは全てB側で行い、Aは参照するだけということになりそう。

こちらはテストしていませんので、アイデアのみです。他に問題があるかも。
いずれにしろ、面倒そうですね。

>あるいは、BからAの監視を続け、リロードが終わった時に
>window.opener経由でメッセージを送る等の処理を実現する
>手段はないでしょうか?
簡単なテストをしてみましたが、できないことはなさそう。
ただし、いろいろな可能性があるので、それにちゃんと対処しようとすると少々面倒そうな気が…

以下、正常な処理の場合。
1)AのunloadイベントでBの関数を呼び出す。
2)Bの関数からsetTimeoutなどでBの監視関数を呼び出す。
3)Bの監視関数はopenerのreadyStateがcompleteになるまで、自分自身をsetTim...続きを読む

Q子ウインドウを閉じて 親ウインドウを更新

初歩的なことなのかもしれませんが、ご教授いただけると助かります。

やりたい動作は、

親ウインドウから<a href="" target=_blank>で
子ウインドウを開きます。

子ウインドウで処理を行った後、

----ここからの動作がわかりません-----

子ウインドウ上のボタンかアンカータグで

親を再読み込み
子を閉じる
親にフォーカス

こんな動作をJAVASCRIPTで実現可能でしょうか?
結果的に、子が閉じられ、親が再読み込みされた状態でフォーカスがあたるようにできれば最高です。

暇なときでかまいませんので、どうぞよろしくお願いいたします。

Aベストアンサー

こんな感じでいいかと思います
------------------------------
<script type="text/javascript">
<!--
function p_reload(){
var pwin=window.opener;
pwin.location.reload();
pwin.focus();
window.close();
}
//-->
</script>

<button type="button" onclick="p_reload()">親を更新して閉じる</button>

Q画面間でのJavaScriptでの値の受け渡しについて

お世話になります。

画面(ASPで作成した画面)間でのJavaScript同士の値の受け渡しは出来るのでしょうか。

画面1から画面2を開き、画面2のJavaScriptの関数内で画面1のJavaScriptの値を変えると言った事は出来るのでしょうか。

何方かご存知でしたら、お教え下さい。
宜しくお願い致します。

Aベストアンサー

IEとFireFoxで試してみましたけど、できそうですね。
tes1.htmlからtes2.htmlを開いた場合のソースです。
関数はボタンとかから適当に呼んでください。

// tes1.htmlのJavaScript
var value=0;
function msg () {
alert(value);
}
function openWnd () {
wnd = window.open("tes2.html");
}

// tes2.htmlのJavaScript
function count () {
opener.value++; // openerが親元
alert(opener.value);
}


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング