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

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

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

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

JavaScript

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

Q&A

解決済

2回答

1266閲覧

JavaScriptの実行タイミングの制御について

merci_children

総合スコア44

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

JavaScript

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

0グッド

0クリップ

投稿2019/07/29 13:05

編集2019/07/29 23:25

【問題】
JavaScriptの実行タイミングを制御できず困っています。
xxx.jsp(HTMLを展開)→ b.js → a.js という制御をしたいです。

現在は以下のようなソースコードを記載しているのですが、デバックで確認したところ
xxx.jsp(HTMLを展開)→ a.js → b.js という制御になっているように見えています。
deferをつけることでHTMLが展開されてから、JavaScriptを実行することができ、
windows.onloadはすべてのJavaScriptが完了した際に呼び出されると知ったため以下のようなコードにしています。
原因がまったくわからないです。恐れ入りますが、アドバイスいただけると幸いです。

【xxx.jsp】

<head> <script src "b.js" defer></script> </head> <body> <script src "a.js" defer></script>

【a.js】

$(windows).on('load', function(){ windows.scrollTo(0, target.offset().top); });

【b.js】

(function (win, doc, $, util) { ~コード (アコーディオンを作成したりいろいろ行っている)

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

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

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

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

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

x_x

2019/07/30 00:28

= がなかったり windows になっていたりするので動作するコードをお願いします。
guest

回答2

0

ベストアンサー

.onloadはすべてのJavaScriptが完了した際に呼び出される

いいえ、windowのloadイベントが発生したとき呼び出される関数です。
javascriptが完了した際というよりはページの読み込みが完了した時実行される感じです。

b.jsの読み込みをa.jsより先にしたいなら、<script src ="b.js" defer></script><script src ="a.js" defer></script>より前に持ってくればオーケーです。本当にそれが全てです。

でもきっと困ってることはそういうことじゃないですよね?
a.jsの中にb.jsに依存している機能があるとか、b.jsのとある処理が終わったあとに、a.jsの何某処理をしたいとか、そういう話ではないでしょうか?
そこは言ってくれないとわかりません。

それと$(windows).はjQueryの書き方ですがjQuery読み込んでますか?

追記
画面に動きがある状態をjavascript実行中で、画面の動きが止まった状態をjavascriptが完了した時だと思っているのですね。
実は画面に動きがある時、常にjavascript実行中だと不都合が生じます。
javascriptが実行している間、ブラウザは固まった状態になりユーザーは画面を操作できないからです。
これはユーザーはかなりイライラします。

しかし、実際は画面が動いていても、そうはならない場合がほとんどです。
人間にはなめらかに画面が動いているように見えても、非常に短い間隔でjavascriptの実行と完了を何度も繰り返しているためです。
これを実現するための仕組みが非同期処理です。

解決方法については、b.jsがどんな処理をしているか分からない以上なんとも言えませんが、yambejpさんの回答のPromiseを使うのはモダンで賢いやり方です。

ですが、まずは「画面の動きが止まったとき」に実行したいa.jsについて、「なぜ画面の動きが止まったときにa.jsを実行したいのか」を明確にしましょう。
たとえば、画面の動きが止まった後でないと出てきてくれないDOM要素があって、そのDOM要素を操作したいのであれば、「そのDOM要素が現れるまで、非同期処理で実行を保留にする」ことが思いつけると思います。
そしたら「あるDOM要素が現れるまで、非同期処理で実行を保留にするにはどうすればいいか」を考えてみてください。

投稿2019/07/29 15:25

編集2019/07/30 03:24
yutampp

総合スコア182

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

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

merci_children

2019/07/29 23:27 編集

回答ありがとうございます。 すいません。JSを読み込む順番についてソースコードを間違えてしまったので、編集させていただきました。 .onloadはすべてのJavaScriptが完了した際ではないのですね。。。 困っていることは、b.jsがすべて完了したあとにa.jsの.onloadメソッドを呼び出したいのですが、b.jsの実行中にa.jsの.onloadメソッドが実行されてしまっているため意図した動きになりません。 (具体的には、指定した位置に自動スクロールしたいのですが、a.jsがb.jsの途中で呼び出されているためアコーディオンの開閉バーなどを作成したときに開閉バーなどのアイコン分スクロール位置がずれてしまいます。) 上記からb.jsの実行中にwindowのloadイベントが実行されてしまうと考えたため、b.jsが完全に完了してからa.jsを実行したいと考えたのですが、なにか解決方法を教えていただきたいです。
yutampp

2019/07/30 03:32

追記しました。 私の個人の感想なのですが、「画面の動きが止まった後、指定した位置に自動スクロール」が実現できたとして、それを実際に目のあたりにすると、自分の操作を邪魔されたみたいでイライラするとおもいます。 画面に何か表示された瞬間に、(あるいはせっかちな人はそれより前に)ユーザーはもう、画面操作については自分が行うものだと考えているはずです。 そこを勝手に画面がスクロールしたら「なにくそ!」と感じる・・・と思うんですがいかがでしょう?
merci_children

2019/07/30 12:03

ご丁寧な回答ありがとうございます。 非同期処理という仕組みについて、知ることができ大変ためになりました。 JS内で非同期処理を行っていることは確認できたため、Promiseを使用して実装できるか確認してみようと思います。 (過去にいろいろあったらしく、過去の仕様を変えることは調整が必要で厳しいらしいので。。。)
guest

0

おそらく非同期の処理がはいっているのでしょう
非同期でないなら呼び出し順に実行されると思います
順番を守りたい場合はa,bをリンクさせるような処理が必要になると思います。
無理やりやるならこんな感じ

javascript

1<script> 2flg_a=false; 3new Promise(resolve=>{ 4 setTimeout(function(){ 5 console.log("b"); 6 resolve(); 7 },2000); 8}).then(()=>flg_a=true); 9</script> 10<script> 11var timer_a=setInterval(function(){ 12 if(flg_a){ 13 console.log("a"); 14 clearInterval(timer_a); 15 } 16},10); 17</script> 18

投稿2019/07/30 01:03

yambejp

総合スコア114769

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

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

merci_children

2019/07/30 11:57

回答ありがとうございます。 確認したところ、非同期の処理が入っていました。 Promiseを使用して、実装できるか確認してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問