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

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

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

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

Q&A

解決済

1回答

6507閲覧

外部jsファイルのwindow.openで開いたサブウィンドウから値をjsに値を返したい.

shikasama

総合スコア163

JavaScript

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

0グッド

0クリップ

投稿2016/08/28 02:05

編集2016/08/30 01:46

観覧ありがとうございます.

以下のことを実現したいと思っています.
1.外部jsファイルの関数からwindow.openでサブウィンドウを開く.
2.サブウィンドウでは複数あるボタンから1つを押下する.
3.サブウィンドウを呼び出した関数にボタンごとに異なる変数を返す.
4.帰ってきた文字列ごとに開くページを変える.

window.showModalDialogでページを開いた場合にはreturnValueを用いることで,
変数を返すことができるみたいなのですがwindow.openでも同様のことをしたいと思います.
どのようにしたら実現可能でしょうか?ご教示ください.

追記

親ウィンドウ

html

1<head> 2<script type="text/javascript" src="@Url.Content("~/Scripts/output.js")"></script> 3</head> 4<body> 5<button type="button" onclick="showNewWindow(1) %>);">出力</button> 6</body>

output.js

javascript

1function showNewWindow(manageNo) { 2 var w_size = 200; 3 var h_size = 260; 4 var ret = ''; 5 var openWindow = open(url, '_blank', 'height=' + w_size + ',width=' + h_size + ',height=' + h_size); 6 7 if (window.addEventListener) { 8 window.addEventListener('message', function (event) { 9 ret = event.data 10 outputExcel(ret, manageNo); 11 }, false); 12 } else if (window.attachEvent) { 13 window.attachEvent('message', function (event) { 14 ret = event.data 15 outputExcel(ret, manageNo); 16 }); 17 } 18} 19 20function outputExcel(ret, manageNo) { 21 if ('html' == ret) { 22 return sendPostNewWindow(document.forms[0], '../Excel/Present?no=' + manageNo); 23 } else { 24 //処理 25 } 26} 27 28function returnMessage(text) { 29 window.opener.postMessage(text, '*'); 30 window.close() 31}

子ウィンドウ

html

1<head> 2<script type="text/javascript" src="@Url.Content("~/Scripts/output.js")"></script> 3</head> 4<body> 5<input type="button" name="xlxsButton" style="width:200px;" value="button" onclick="returnMessage('html');"> 6</body>

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

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

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

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

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

guest

回答1

0

ベストアンサー

postMessageというメソッドで別のウィンドウへメッセージを投げて、それをmessageというイベントハンドラで捕捉することができます。

簡単な例を示します。以下をindex.htmlとかそんな名前で保存します。

html

1<!doctype html> 2 3<html> 4 <head> 5 <meta charset="utf-8"> 6 <title>window.postMessage</title> 7 </head> 8 <body> 9 <button id="open">open</button> 10 <div>クリックされたボタン:<span id="result"></span></div> 11 12 <script> 13 (function () { 14 var open = document.getElementById('open') 15 var result = document.getElementById('result') 16 17 open.addEventListener('click', function () { 18 window.open('sub.html') 19 }) 20 21 window.addEventListener('message', function (event) { 22 console.log(event) 23 result.textContent = event.data 24 }) 25 })() 26 </script> 27 </body> 28</html>

で、以下をsub.htmlで保存します。

html

1<!doctype html> 2 3<html> 4 <head> 5 <meta charset="utf-8"> 6 <title>window.postMessage</title> 7 </head> 8 <body> 9 <button id="btn1">1</button> 10 <button id="btn2">2</button> 11 <button id="btn3">3</button> 12 13 <script> 14 (function () { 15 for (var i = 1; i < 3; i++) { 16 document.getElementById('btn' + i).addEventListener('click', function (event) { 17 window.opener.postMessage(event.target.textContent, location.origin) 18 window.close() 19 }) 20 } 21 })() 22 </script> 23 </body> 24</html>

これで、適当にサーバーを立ち上げてindex.htmlの方にアクセスすれば動作を確認できます。

ポイントは、window.openでページを開いた先のウィンドウで、開いた元のウィンドウはwindow.openerで取得できることです。

参考

また、他にもdocument.titleを変更する方法などがありますが、あまり推奨される方法ではありません。

投稿2016/08/28 03:03

編集2016/08/28 03:04
MakeNowJust

総合スコア545

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

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

shikasama

2016/08/28 04:08

MakeNowJust様 ご回答ありがとうございます. 実際に動かせていないのですが,postMessageをググってみて できそうな気がしました.もう少し調べてご提示いただいたコードを理解してから 明日実施したいと思います.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問