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

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

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

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

jQuery

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

Q&A

解決済

1回答

8729閲覧

親画面で子画面側の動作完了を検知して、自身(親画面)の関数を実行したい

saya24

総合スコア222

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2019/02/25 12:48

前回の問合せに引き続いての内容です。
親画面側から呼び出された子画面の動作(親画面の要素を設定)し終えたら
親画面側の関数を実行したいです。

前の質問は、子画面から親画面の関数を呼び出そうとしていたのですが、今回の質問は
親画面側で子画面の動作完了を検知できたら! と逆の発想を思い付きました。

子画面側のJSにより、自らの画面がcloseされたとき、もしくは子画面JSの処理が完了したことを検知する方法、また、その後の自身(親画面)の関数を実行する方法を ご教示頂けないでしょうか?
よろしくお願い致します。

JavaScript

1//【親画面】 2$(function(){ 3 4 //子画面は この関数の動作によって開く 5 function winOpen(url, width, height) { 6 if (width > 800) { 7 width = 800; 8 } 9 if (height > 600) { 10 height = 600; 11 } 12 var w = ( screen.width-width ) / 2; 13 var h = ( screen.height-height) / 2; 14 window.open(url, "_blank", "toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, " + 15 "resizable=yes, width=" + width + ", height=" + height + ", left=" + w + ", top=" + h); 16 } 17 18 // この関数を子画面の動作が完了したら動かしたい 19 function updGet () { 20 var r = $("[name='q1']:checked").val(); 21 if (r != "0") { 22 clrItems(); 23 updRenew(); 24 FixedMidashi.create(); 25 } 26 } 27 28}); 29 30 31//【子画面】 32$("[name=car_model]").on("change", function(){ 33 34 window.opener.document.getElementById("dcd").value = tcd.trim(); 35 window.opener.document.getElementById("dname").value = tname.trim(); 36//★ window.opener.updGet(); 親画面の関数、グローバルでなく呼べない 37 close(); 38}); 39

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

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

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

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

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

guest

回答1

0

ベストアンサー

当該の関数が「グローバルでなく呼べない」という理由がわかっている状態で、当該の関数をグローバルにしていないようなので、おそらくグローバルに「したくない」か「できない」かのいずれかだろうと思います。

以下のように、jQueryの名前空間に関数を定義すれば、当該の関数自体を「グローバルに定義」せずに仕様を満たせます。ただし、jQueryが window.jQuery として定義されている必要があります。

//【親画面】 $(function(){ //子画面は この関数の動作によって開く function winOpen(url, width, height) {   /* 省略 */ window.open(/* 省略 */); } // window.jQuery.updGet と同じ $.updGet = function() {   /* 省略 */ } });
//【子画面】 $("[name=car_model]").on("change", function(){ window.opener.$.updGet(); close(); });

追記(2019/3/1)

もうご自分で試していると思いますが、念の為補足します。
関数定義を変えているので、当然関数の呼び出し方も変わります。

$.updGet = function() { ... } updGet() // -> Uncaught ReferenceError: updGet is not defined $.updGet() // -> OK!

既存の関数呼び出しの記述を変えたくないのであれば、
一度以前の通り関数を定義して、そのあとjQueryの名前空間に定義すれば解決します。

function updGet() { ... } $.updGet = updGet // 関数を代入する updGet() // -> OK! $.updGet() // -> OK!

投稿2019/02/25 15:02

編集2019/03/01 14:51
NozomuIkuta

総合スコア1260

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

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

saya24

2019/02/25 23:46 編集

ご支援誠にありがとうございます。明日会社でやってみればわかることですが、従来親画面のなかでもupdGet()を呼び出す部分がありました。親画面自身からこのfunctionを呼び出す方法はかわるのでしょうか?
saya24

2019/03/01 15:18

追記頂かなければ 分からなかったことなので大変助かります。ありがとうございました。
NozomuIkuta

2019/03/01 16:26

参考になったようでよかったです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問