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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Microsoft Edge

Microsoft Edgeは、マイクロソフト社が開発する新しいWebブラウザです。Windows 10から標準搭載されており、Internet Explorerとは違うレンダリングエンジンが採用されています。

JavaScript

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

Q&A

解決済

1回答

12138閲覧

Edgeブラウザにて子画面から親画面に値を受け渡す処理

gapmjgmpt

総合スコア3

Microsoft Edge

Microsoft Edgeは、マイクロソフト社が開発する新しいWebブラウザです。Windows 10から標準搭載されており、Internet Explorerとは違うレンダリングエンジンが採用されています。

JavaScript

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

0グッド

0クリップ

投稿2021/09/02 10:54

編集2021/09/03 15:37

前提・実現したいこと

モーダル画面機能がEdgeブラウザで廃止されたので、Edgeブラウザで子画面から親画面に値javascriptで受け渡したい

発生している問題・エラーメッセージ

window.opener[callback_id] is not a function

該当のソースコード

親画面.html <script type="text/javascript" src="子画面から親画面に値渡し.js"></script> <meta charset="UTF-8"> <body> <input type="button" value="変更" onClick="ButtonClick()" /> </body> <script type="text/javascript"> //変更ボタン押下時の処理 function ButtonClick(){ var callback_id = 'callback_modal'; window[callback_id] = function(ret) { //trueが表示されることを確認 alert(ret.status); return ret ? ret : {"status":false }; } //子画面ウインドウを開く //var ret = openChild("子画面.html"); var ret = openChild("子画面.html",window[callback_id]); //(ここ処理が通るのを確認したい) if(ret.status) { alert(ret.status); } } </script>
小画面から親画面に値渡し.js //モーダル画面呼び出し //function openChild(url) { function openChild(url,callback) { return openDialog(url,900,680,callback); } //function openDialog(url,width,height){ function openDialog(url,width,height,callback){ //var callback_id = 'callback_modal'; //window[callback_id] = function(ret) { ////trueが表示されることを確認 //alert(ret.status); //return ret ? ret : {"status":false }; //}   //小画面呼び出し var ret window.open(url, callback,    "dialogWidth:" + width + "px;" +   "dialogHeight:" + height + "px;" + "center:yes; scroll:no;"); return ret; }
小画面.html <input type="button" value="確定" onClick="ButtonClick()"> <meta charset="UTF-8"> <script type="text/javascript"> //確定ボタン押下時 function ButtonClick(){ var ret = { "status" : true }; var callback_id = window.name; window.opener[callback_id](ret); window.close(); </script>

試したこと

https://qiita.com/hidehito108/items/f7ad9fe23736049a76d6
上記のサイトを参考にして、作業してみたのですがうまくいかず
htmlファイル2つでの値を受け渡す処理の記事は結構出てきたのですが、jsファイルを挟んで処理する
例は探してもなかったので、少し勝手が違うのでしょうか?

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。
サーバー言語:java
ブラウザ:chromium版 Edge IEモード
デスクトップ上に置いてもエラーを吐くようなのでapache2.4.43をインストールしてローカルサーバー上にhtml,jsを設置して動作確認中

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

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

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

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

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

int32_t

2021/09/03 13:14

サーバは関係ないので、「Java」「Apache」のタグは消してください。
guest

回答1

0

ベストアンサー

関数 openDialog() が何を返すか確認しましょう。

js

1function openDialog(url,width,height){ 2 ... 3 window[callback_id] = function(ret) { 4 ... 5 return ret ? ret : {"status":false }; 6 } 7 window.open(...) 8}

この関数、何もreturnしていません。よって、返り値を代入すると undefined になります。
この中に書かれている無名関数のreturnの値はどこに行くかというと、

js

1 window.opener[callback_id](ret);

子画面のこのコードの返り値になります。

非同期な動作なので、関数 ButtonClick() の中で ret の値を返り値として受け取ることはできないのです。
(Promiseasync await を使うと可能ですが、IE モードではダメでしょう)

ret を使ってやりたい処理は、上記の無名関数の中に書くか、openDialog() にコールバック関数を渡すなどする必要があります。

投稿2021/09/03 00:23

int32_t

総合スコア21695

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

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

gapmjgmpt

2021/09/03 09:15

回答ありがとうございます。 改修の都合上、親画面でretの値を触りたいのでopenDialog()にコールバック関数を渡すという手法を試してみます 上記のように修正してみましたがエラーメッセージも変わりました そもそも親画面の記述でコールバック関数を定義してopenChild関数呼び出し時の引数にコールバック関数を用いるという認識なのですが合ってますか? 正直、どういう処理を意図してコールバック関数をopenDialog()の引数に使うのかイメージが湧いてこないです コールバック関数を複数定義しなければならないということではないですか?
int32_t

2021/09/03 12:53 編集

現在のコードで var ret window.open(url, callback, を var ret = window.open(url, 'callback_modal', に修正すれば動くんじゃないでしょうか。window.open() の第2引数はウィンドウ名の文字列です。 回答を書いた時点では、以下のような修正を想定していました: * openDialog() に callback 引数を足し、中の無名関数から callback(ret) を呼ぶ。または window[callback_id] に callback を代入する * openChild() に callback 引数を足し、openDialog() に渡す * ButtonClick() は openChild() に ret を処理するコールバック関数を渡す
gapmjgmpt

2021/09/03 17:07 編集

ご回答誠にありがとうございます 上記のようにそもそもopenchildの第二引数をcallback_idを指定したら小画面も閉じるようになりエラーもなくなりました ただ、openchild関数の後ろのアラート関数については、ここのif分を外して確認したのですが小画面の処理よりも先に後ろのalert処理が走るようなので、retの値を触りたい時は無名関数内で触るのが現実的なのかと思いました(ここのアラート処理は確認済み) ret.statusが未定義ですというエラーも厳密な条件はよく分かりませんが記述によって出る時もあれば出ないときもあるみたいです(ここの記述はなくても改修に影響はないと踏んでいます) 無名関数内で触れれば他の関数で不要なreturn記述も必要ないかと思っています ご協力ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問