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

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

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

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

1236閲覧

<input>の値を取得し、別関数にreturnで渡したい

nerunoda

総合スコア7

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/05/07 12:44

編集2020/05/07 13:14

前提・実現したいこと

入力できるダイアログをバニラjavascriptで作っています。

ダイアログを動的に生成・表示させたいため、<dialog> <form> <input>createElement()で定義しています。
モーダルダイアログを作ろうと思っているのですが、その際に<input>の値をreturnで返すことができません。

追記
タイトルの「別関数」は、下記ソースコードのmain()です。
説明不足でした。
申し訳ありません。

お力添えよろしくお願いします。

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

値をreturnで受け渡しすることができない。

該当のソースコード

html

1<!DOCTYPE html> 2 3<html> 4 5<head> 6 <script> 7 // メイン 8 function main() { 9 var foo = createDialog(); 10 console.log(foo); // これはコンソールで確認できない 11 } 12 13 // 入力ダイアログを作る関数 14 function createDialog() { 15 // 要素の定義 16 var dialog = document.createElement("dialog"); 17 dialog.id = "dialog"; 18 19 var form = document.createElement("form"); 20 form.method = "dialog"; 21 22 var input = document.createElement("input"); 23 input.id = "input"; 24 25 // 要素を追加 26 form.appendChild(input); 27 dialog.appendChild(form); 28 document.body.appendChild(dialog); 29 30 // dialogをモーダル表示する 31 var moge = document.getElementById("dialog"); 32 moge.showModal(); 33 34 // <input>の値をreturnしたい... 35 moge.addEventListener("close", () => { 36 var hoge = document.getElementById("input").value; 37 console.log(hoge); // これはコンソールで確認できる 38 return hoge; // これはコンソールで確認できる 39 }); 40 } 41 </script> 42</head> 43 44<body onLoad="main()"> 45</body> 46 47</html>

試したこと

追記
hogeをグローバルに定義し、<input>の値を格納してみましたが表示されませんでした。

html

1<!DOCTYPE html> 2 3<html> 4 5<head> 6 <script> 7 var hoge; // hogeをグローバルで定義 8 // メイン 9 function main() { 10 createDialog(); 11 console.log(hoge); // これはコンソールで確認できない 12 } 13 14 // 入力ダイアログを作る関数 15 function createDialog() { 16 // 要素の定義 17 var dialog = document.createElement("dialog"); 18 dialog.id = "dialog"; 19 20 var form = document.createElement("form"); 21 form.method = "dialog"; 22 23 var input = document.createElement("input"); 24 input.id = "input"; 25 26 // 要素を追加 27 form.appendChild(input); 28 dialog.appendChild(form); 29 document.body.appendChild(dialog); 30 31 // dialogをモーダル表示する 32 var moge = document.getElementById("dialog"); 33 moge.showModal(); 34 35 // <input>の値をreturnしたい... 36 moge.addEventListener("close", () => { 37 hoge = document.getElementById("input").value; // グローバル変数に値を格納 38 }); 39 } 40 </script> 41</head> 42 43<body onLoad="main()"> 44</body> 45 46</html>

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

  • 使用ブラウザはchrome最新版です
  • electronを使っているため、prompt()が禁止されています

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

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

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

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

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

kei344

2020/05/07 13:03

「別関数にreturnで渡したい」とありますが、具体的に渡す関数を提示してください。
nerunoda

2020/05/07 13:15

修正しました。 説明不足でした。 申し訳ないです。
guest

回答2

0

ベストアンサー

createDialog内のmogeのcloseを待って処理したいなら
promiseするのが妥当

投稿2020/05/07 13:10

yambejp

総合スコア114839

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

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

yambejp

2020/05/07 13:11

<script> function main() { createDialog().then(foo=>{; console.log(foo); }); } async function createDialog() { return new Promise(resolve=>{ var dialog = document.createElement("dialog"); dialog.id = "dialog"; var form = document.createElement("form"); form.method = "dialog"; var input = document.createElement("input"); input.id = "input"; form.appendChild(input); dialog.appendChild(form); document.body.appendChild(dialog); var moge = document.getElementById("dialog"); moge.showModal(); moge.addEventListener("close", () => { var hoge = document.getElementById("input").value; resolve(hoge); }); }); } </script> <body onLoad="main()"> </body>
nerunoda

2020/05/07 13:29

回答ありがとうございます。 いただいたコードで希望の動作を実装することができました! 「closeが呼び出されるのはユーザが入力されてからで、それより前にmain()のconsole.log()が実行されるから表示されない」「そこで、処理の順番を指定するPromise(←間違ってたらごめんなさい)を使用して、closeが呼び出されるまでmain()のconsole.log()が実行されないようにする」という問題の原因も教えていただき、ありがとうございました。 また、再び回答してもらってありがとうございます! とても助かりました。
guest

0

その変数hogeをグローバルで定義されては。

投稿2020/05/07 12:46

m.ts10806

総合スコア80850

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

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

nerunoda

2020/05/07 12:59

回答ありがとうございます。 「試したこと」に追記した通りやってみましたが、動きませんでした。 m.ts10806さんのアドバイスはこの記述で合っていましたか。
m.ts10806

2020/05/07 13:02

よく読んだら「mogeのcloseイベント時に」ですね。 その仕組みでは無理です。close(そのようなイベントがとれるかは知らないけど)イベントが起きない限りinputの値は入ってきません。 main()実行時にはshowModal()されただけです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問