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

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

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

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

JavaScript

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

Q&A

解決済

2回答

448閲覧

JavaScriptでブラウザをスクロールさせたい

mozamoza_fruit

総合スコア11

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

JavaScript

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

0グッド

0クリップ

投稿2021/09/04 18:22

概要

Chrome上でタブを複数生成し、それぞれを既定量スクロールさせる処理を書いています。

実現したいこと

下記の内容を実現したいです。

  1. 同一URLのタブを複数生成
  2. タブそれぞれをスクロール
  3. 各タブのスクロールを連動させる

この中で特に2の実現方法がわからず悩んでいるので助言いただきたいです。

javascript

1 let tab0; 2 let tab1; 3 let tab2; 4 for(i = 0; i < TileCount; i++){ 5 let tab = eval("tab"+i) 6 OpenTab(tab); 7 async function OpenTab(sideTab){ 8 sideTab = window.open(sideUrl); //1. 同一URLのタブを複数生成 9 10 const _sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); 11 await _sleep(3000); 12 13 sideTab.scrollTo(0, windowHeight * (i + 1)); //2. タブそれぞれをスクロール 14 15 document.addEventListener('scroll', e => { 16 sideTab.scrollTo(window.scrollX + adjX, window.scrollY + adjY); //3. 各タブのスクロールを連動させる 17 }); 18 19 } 20 }

試したこと

グローバルな変数tab0 tab1 tab2を用いずに、forの中でタブウィンドウを代入する変数let sideTabを宣言しますと
生成したタブはスクロールされますが、全てのスクロール量が同一になってしまします。
sleep()の引数を変えると微妙にスクロール量がそれぞれバラけますがほとんど同じスクロール量です。

解決の糸口がまるで見えないので助力いただけると幸いです。
宜しくおねがいします。

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

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

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

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

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

hoshi-takanori

2021/09/04 20:59

変数 tab0, tab1, tab2 じゃなくて、配列を使うと良いかも。
mozamoza_fruit

2021/09/05 06:50

コメントありがとうございます! let tab 0;~ではなく let arrary = [,,,];としてやってみましたが scrollイベント内の array[i].scrollTo() 部分で`i`番目が見つからないというエラーが出てスクロールされませんでした。。 let array; として宣言時は空にしてもやってみましたが、今度はOpentab関数内の sideTab[i].scrollTo() で上記同様のエラーがでてしまいました。。
guest

回答2

0

御回答ありがとうございます!
返信遅れてしまいすみません。。

openTab()の実行はfor(){}のスコープ内なので、openTab()の処理が終ってからiがインクリメントされるという認識でしたが
jsの仕様だとそうはならないのでしょうか?

基本的なことかと思いますが教えて頂ければ幸いです。

投稿2021/10/15 10:11

mozamoza_fruit

総合スコア11

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

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

0

ベストアンサー

sideTab.scrollTo(0, windowHeight * (i + 1)); を実行している時点で外側のループが終了しているため、常に i の値が TileCount になっているのだと思います。現在のコードだと、複数のOpenTab()関数が実行されてもみんな同一のiを参照しています。

OpenTab()i の引数を与えるとよさそうです。

js

1 OpenTab(tab, i); 2 async function OpenTab(sideTab, i) {

投稿2021/09/28 08:35

int32_t

総合スコア21020

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

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

mozamoza_fruit

2021/10/15 10:11

御回答ありがとうございます! 返信遅れてしまいすみません。。 openTab()の実行はfor(){}のスコープ内なので、openTab()の処理が終ってからiがインクリメントされるという認識でしたが jsの仕様だとそうはならないのでしょうか? 基本的なことかと思いますが教えて頂ければ幸いです。
int32_t

2021/10/15 12:33

OpenTab()の呼ぼだしに await が付いていないため、forループ内で実行されるのはOpenTab()内の最初のawaitの前までです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問