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

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

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

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

Q&A

解決済

2回答

1589閲覧

Javascriptの基礎的な質問です。

fama

総合スコア105

JavaScript

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

0グッド

0クリップ

投稿2016/02/20 02:56

編集2016/02/20 06:44

現在、ボタンをクリックするとページを下に3秒毎に繰り返しスクロールする処理を実装しようとしています。

javascript

1function startScroll() 2{ 3 timer = setInterval(scrollDown(),3000); 4} 5 6function scrollDown() 7{ 8 var webview = document.getElementById('mainWebview'); 9 webview.executeJavaScript('window.scrollTo(0, 100000000)'); 10}

このように記述した場合、スクロールが1回のみ行われ処理が終わります。
なぜ1回のみしか処理が行われないのかがわからず試行錯誤して timer = setInterval(scrollDown(),3000); をfunctionの外に出してみました。

javascript

1 timer = setInterval(scrollDown(),3000); 2 3function scrollDown() 4{ 5 var webview = document.getElementById('mainWebview'); 6 webview.executeJavaScript('window.scrollTo(0, 100000000)'); 7}

すると、求めている処理(ボタンを押すとスクロールループ)とは違いますが、ページが開いてから繰り返しスクロールをループしてくれました。

このように、 timer = setInterval(scrollDown(),3000); をfunctionの中に入れてonclickイベントで呼び出した場合はなぜ1回のみの実行になり、functionの外に出した場合は正常にループしてくれるのか仕組みがわからず困っています。

わかりやすく説明して頂ける方はいらっしゃいませんでしょうか?

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

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

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

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

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

fama

2016/02/20 06:42

ご指摘ありがとうございます!修正致します!
guest

回答2

0

ベストアンサー

質問の内容を変更する場合は質問の編集機能を使用してください。重複質問ととられてしまうのが普通です。

setInterval 関数が第一引数に取るのは Function オブジェクト、すなわち関数です。
下の (1) と (2) の記述の意味の違いに注意してください。
scrollDown 関数は値を返さないので setInterval には undefined が渡されます。

lang

1// (1) scrollDown 関数が渡される(3 秒間隔の実行が予約される) 2setInterval(scrollDown, 3000); 3// (2) scrollDown 関数の実行結果が渡される(副作用的にこの時点で一度だけ実行される) 4setInterval(scrollDown(), 3000);

次に scrollDown の中身ですが、これは原点(画面の左上)を基準にして、(x: 0, y: 100000000) の位置にスクロールするものです。何秒経ってもこの位置は同じですがこれは意図通りですか?
たとえば 3 秒ごとに少しずつスクロールする場合は window.scrollBy を使用してください。

投稿2016/02/20 05:59

chitoku

総合スコア1610

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

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

fama

2016/02/20 06:30

chitokuさんいつもありがとうございます! 意味をとても正確に理解する事が出来ました! 今実際に実装してみたのですが、どうしても function の中に入れてonclickイベントで呼び出した場合にはこの方法でも1回しか実行がされないです。 ボタンを押した場合にもちゃんとループさせるにはこのやり方ではできないのでしょうか?
chitoku

2016/02/20 06:46

イベントで呼びされた場合か否かはこの場合は関係ないはずです。(JavaScript でイベントによる呼び出しが影響するのはウィンドウを開く処理だけです) fama さんが書いたボタンに反応する処理が質問に掲載されていないのでなんとも言えないですが、呼び出す関数が startScroll になっているか確認してみてください。 (scrollDown 関数を呼び出してもタイマーの意味がないので)
fama

2016/02/20 08:17

>イベントで呼びされた場合か否かはこの場合は関係ないはずです。 なるほどです。今もう一度やってみたのですが、やはりfunctionの中に入れた場合は処理が1回しか行われず、functionの外に出すと3秒毎にループしてくれます 汗 でもこれだとボタンを押した時の処理として出来ないのでとても困ってます 涙
chitoku

2016/02/20 08:48

書き足した結果どのような処理になったか不透明なので質問欄かどこかに現在のコードを書いてもらえますか?(コメント欄は見にくいのでw) onclick に追加する処理も書いてもらえれば原因が分かるかもしれません。
fama

2016/02/20 09:45

なるほどです!teratailの使い方も勉強になります! 後、今回問題が解決致しました! 私の初歩的なミスでして、正常にコードを書くところまではできていたのですが、呼び出す処理をhtml側で間違えていました 涙
chitoku

2016/02/20 09:46

解決してよかったですね。
guest

0

javascript

1setInterval(scrollDown(),3000);

より、

javascript

1setInterval( 2 function(){ 3 //処理 4 }, 3000 5);

の方が私は好きです。
ほかのメソッドからも呼び出すようなメソッドでなければ、この方が見やすいと思います。
変数のスコープとかもわかりやすいし。

投稿2016/02/20 04:37

otftrough

総合スコア476

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

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

fama

2016/02/20 06:31

otftroughさんアドバイスありがとうございます! たしかにこれは見やすいですね!ちょっと記述してみます★
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問