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

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

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

SharePointは、マイクロソフトにより開発された、ソフトウェア開発のドキュメント管理やコラボレーションを行うプラットフォームの総称です

JavaScript

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

jQuery

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

Q&A

解決済

1回答

849閲覧

【Javascript】関数内でpromise.doneの後にreturn trueしたい【SharePoint】

Ebonights

総合スコア33

SharePoint

SharePointは、マイクロソフトにより開発された、ソフトウェア開発のドキュメント管理やコラボレーションを行うプラットフォームの総称です

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2019/07/04 09:56

前提・実現したいこと

ある関数がonClickで呼び出され、その関数内で子ウィンドウを開く→呼び出し元の関数終了(return true)と定義したいと考えています。

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

後述するソースコードのように記載したのですが、promise.doneを待たずに呼び出し元の関数が完了してしまいます。
当方初心者であるため、恐らく記載方法が誤っていると思うのですが、
現状解決しない状態のため、ご助言等頂ければ幸いです。

該当のソースコード

HTML

1<script 2 src="https://code.jquery.com/jquery-3.4.1.js" 3 integrity="sha256-WpOohJOqMqqyKL9FccASB9O0KwACQJpFTUBLTYOVvVU=" 4 crossorigin="anonymous"></script> 5<script type="text/javascript"> 6"use strict"; 7 8// 引き継ぐプロパティ変数 9var test = test || {}; 10test.openform = test.openform || {}; 11test.openform.glvars = test.openform.glvars || {}; 12 13test.openform.glvars.url='展開するURL'; 14 15//OnClickでこの関数が呼び出される。 16function PreSaveAction(){ 17 if(true){ 18 // ここでいろいろ画面内処理 19 20 var res = confirm('コピーして編集画面を開きますか?'); 21 if (res){ 22   // 新しいタブで指定のURLを展開 23 var childWindow = open(test.openform.glvars.url, "_blank"); 24 var promise = waitForLoading(childWindow) 25 promise.done(function(){return true}) 26 27 return true; // ←これをpromise.doneの後に戻したい。 28 } 29 30 }else{ 31 return false; 32 } 33} 34 35// 子ウィンドウのローディングを待つ 36function waitForLoading(targetWindow) { 37 var d = $.Deferred(); 38 var interval = setInterval(function(){ 39 if(typeof targetWindow.addEventListener === "function"){ 40 clearInterval(interval); 41 targetWindow.addEventListener("load", function(){d.resolve()}) 42 } 43 },100); 44 return d.promise(); 45} 46 47</script>

試したこと

ES6のPromiseを試しましたが、その場合IE11に対応していないということで断念しています。
また、OnClick内のJSを別関数で定義して対応しようとも考えましたが、OnClick内のJSはPostBackが含まれており、
引数などが流動的であるため、断念しました。

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

jquery-3.4.1.js
対応環境:
IE11の最新Ver
Chromeの最新Ver

以上、有識者の方がいらっしゃれば、どうぞ宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

後述するソースコードのように記載したのですが、promise.doneを待たずに呼び出し元の関数が完了してしまいます。

非同期処理とはそういうものです。元の関数の終了を非同期処理が終わるまで待たせる方法はありません

代わりに、「本来のonClickの機能はすべてpreventDefaultしておいて、非同期処理の結果を受け取るコードから、本来onClick後にしたかった処理を動かす」ような間接的手段を取るしかないかと思います。

投稿2019/07/04 11:42

maisumakun

総合スコア145183

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

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

Ebonights

2019/07/04 12:07

早速の確認ありがとうございました。 やはり待つ方法は無いんですね。。。 スクラッチのシステムでは無いのでonClickもいじれないので、待つ必要が無いような方法を取ることで暫定的に対策を打とうと思います。 どうもありがとうございます。非常に助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問