質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

4回答

43734閲覧

子画面が閉じたことを親画面側で検知させる方法(イベント)

turutontanchan

総合スコア17

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

3クリップ

投稿2019/01/25 05:37

編集2019/01/25 06:04

質問失礼致します。

現在、JavaScriptにて以下処理を実装しようとしています。
1、親画面から子画面を開く
2、子画面を閉じる
3、子画面が閉じたことにより、親画面の関数が実行される

javascript

1var win = window.open('', 'child', 'height=100,width=100'); 2win.write('<html><head>'); 3win.write('<script type="text/javascript">'); 4win.write(`<!-- 5function clickBtn(){ 6 window.close(); 7} 8-->`); 9win.write('</script></head><body>'); 10win.write('<input type="button" value="閉じる" onClick="clickBtn()">'); 11win.write('</body></html>');

3の子画面が閉じる→親画面のイベント(関数)が走り出す、というところで躓いており、どうにか子画面が閉じたことを親画面側で検知させる方法を探しております。

####試したこと
以下のように、子画面が開いた後、子画面が閉じられた場合は検知する処理を書こうとしたのですが、以下ではうまくいきませんでした。

$(win).on('load', function(){ $(win).on('unload', function () { console.log("Hello world"); }); });

有識者の方、ぜひお力をお借りできれば幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/01/25 05:54

「試したこと」部分、もう少しコードの全体がわかるような提示の仕方でお願いします。
m.ts10806

2019/01/25 05:57

この書き方だと<script>で囲われてないので子画面のscript実行されないのでは。 `` win.write(`<!-- function clickBtn(){ window.close(); } -->`); ``
turutontanchan

2019/01/25 06:09

コメントありがとうございます。 大部分を省きすぎて必要なところまで省いてしまいました。失礼しました。コードを追加致しました。 試したこと部分は「試したこと」見出しで分けるために上記コードと分断して書いてはいますが、そのまま他コードなど挟むことなく上記コードにくっつけて一続きに書かれています。他にコードはありません。
guest

回答4

0

親側でイベント設定してやればよいのでは?

javascript

1 2let childfunc = ()=>{ 3 console.log("child is closing"); 4}; 5win = window.open(""); 6$(win).on("unload", childfunc); 7

投稿2019/01/25 06:04

tkturbo

総合スコア5572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

turutontanchan

2019/01/25 07:15

コメントありがとうございます。 こちらの方法でも無事期待通りの挙動を確認することが出来ました!ありがとうございます。 追記.これはまた違うお話になるかと思いますが、一応… $(win).on("unload", childfunc);後にデベロッパーツールでchildfunc内でブレークポイントを張り処理を止めると、親画面がブラウザエラーとなりました。 なぜかは分かりませんが…。処理を止めなければ問題なく動作しました。
guest

0

ベストアンサー

javascript

1<script> 2function clickBtn(){ 3 var nwin = window.open('', 'child', 'height=100,width=100'); 4 with(nwin.document){ 5 writeln('<html><head>'); 6 writeln('<script>'); 7 writeln('window.onbeforeunload=function(){'); 8 writeln('opener.alert(1)'); 9 writeln('return 1;};'); 10 writeln('function clickBtn(){this.close();}'); 11 writeln('</'+'script></head><body>'); 12 writeln('<input type="button" value="閉じる" onClick="clickBtn()">'); 13 writeln('</body></html>'); 14 } 15 16}; 17</script> 18<input type="button" value="開く" onClick="clickBtn()"> 19

投稿2019/01/25 06:38

yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

turutontanchan

2019/01/25 07:09

コメントありがとうございます。 上記のonbeforeunloadイベントを使用し無事期待通りの挙動が確認できました。 (都合上、親画面から子画面closeを検知するようにしました) ``` var win = window.open('test.html', 'child', 'height=100,width=100'); win.onbeforeunload = function () {   //処理 } ``` ありがとうございました!
yambejp

2019/01/25 07:11

onpagehideを利用すれば、確認メッセージなしで閉じられます
guest

0

子画面から親画面のメソッドをキックする方法があるようです。

window.close()の前でキックしてやると良いです。
ただ、そのままChromeで実行するとcross-originエラーが出ますけど(IE11では動きます)

投稿2019/01/25 06:20

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

turutontanchan

2019/01/25 07:18

コメントありがとうございます。 window.openerで親画面関数を呼び出す方法も試していたのですが、is not functionエラーで呼び出せませんでした。cross-originエラーが直接関係しているのでしょうか…
m.ts10806

2019/01/25 07:19

たぶん呼び出し方ではないでしょうか。 cross-originについては確かWebサーバー上で実行すれば問題ないはずです(なので「そのまま実行すると」と書きました)
guest

0

Javascript

1function rip(win){ 2 console.log(win+' is dead'); 3} 4if(!window.opener) { 5 window.open('test.html', 'child'); 6} else { 7 window.onbeforeunload = function(){ 8 window.opener.rip(this.name); 9 } 10}

投稿2019/01/25 06:11

kunai

総合スコア5405

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kunai

2019/01/25 06:51

あぁ、これChromeで実行するならローカルファイルではなく、一度サーバにアップロードして動作確認してくださいね。 ファイル名はtest.htmlで
turutontanchan

2019/01/25 07:22

コメントありがとうございます。 window.onbeforeunloadにより無事挙動が確認できました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問