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

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

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

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

Q&A

解決済

1回答

4547閲覧

javascriptで連動スクロールさせるときの、もっと良い書き方を教えてください。

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

0グッド

0クリップ

投稿2017/08/29 01:57

編集2017/08/29 01:59

javascriptのもっと良い書き方を教えて頂きたいです。

今こちらのようにjavascriptで連動してスクロールさせている表があるのですが、
https://jsfiddle.net/r0sc5031/

ご覧のように表が2つになると、1つ目の表しか連動スクロールが効きません。
イメージ説明

そこで次のようなjavascriptを書き足せば2つ目も連動してくれます。

javascript

1<script type="text/javascript"> 2function $E(id){ return document.getElementById(id); } 3function scroll(){ 4 $E("header_h2").scrollLeft= $E("data2").scrollLeft;// 左右連動させる 5 $E("header_v2").scrollTop = $E("data2").scrollTop;// 上下連動させる 6 } 7$E("data2").onscroll=scroll; 8</script>

しかしもちろん、この場合は2つ目の表のHTMLの当該か所のidを、「header_h」から「header_h2」へ、「header_v」から「header_v2」hへ、「data」から「data2」、と書き換えなければなりません。

今回はそのようなidの書き換えをすることなく、2つの表がそれぞれ連動するようなjavascriptの書き方がないものかと思い質問させて頂きました。

つまり「header_h」や「header_v」や「data」というidだけで2つの表がそれぞれ連動するようなスクロール機能が欲しいのです。
(idじゃなくてclassでもいいのですが、それでも同じclassであって欲しいです。)

「表が複数になってもそれぞれスクロールせよ」という魔法の一言、、ないでしょうか?

お詳しい方、どうぞよろしくお願い致します。<(_ _)>

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

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

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

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

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

guest

回答1

0

ベストアンサー

知っての通り、重複するidはつけられないのですべてclassに置き換えます。

HTML

1<!-- イメージ --> 2<div class="x_data_area"> 3 <table class="csTbl"></table> 4 <div class="header_h"></div> 5 <div class="header_v"></div> 6 <div class="data"></div> 7</div>

targetプロパティにより発生源がわかるので、そこからたどればいいでしょう。

JavaScript

1function scroll(event) { 2 let target = event.target; 3 target.parentElement.querySelector('.header_h').scrollLeft = target.scrollLeft; 4 target.parentElement.querySelector('.header_v').scrollTop = target.scrollTop; 5}

https://developer.mozilla.org/ja/docs/Web/API/Event/target

投稿2017/08/29 02:38

x_x

総合スコア13749

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

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

退会済みユーザー

退会済みユーザー

2017/08/29 03:51

ありがとうございます!! そっか、idは重複できないんでしたね。 早速やってみました。 https://jsfiddle.net/r0sc5031/1/ ありゃ。 何か足りないのか、うまく作動してくれない様子です。 きっとリンク先にヒントがあるのかとは思いますが、ちょっと素人すぎて太刀打ちできず、、(>_<) よろしければもう一声、頂戴できませんでしょうか…?
x_x

2017/08/29 04:23

onscroll はどうしましたか? addEventListenerでもいいですが。どこからも呼ばれていないみたいです。
x_x

2017/08/29 04:37

addEventListenerの例。 Array.from(document.getElementsByClassName('data')).forEach(function(element, index, array) { element.addEventListener('scroll', scroll, false); });
退会済みユーザー

退会済みユーザー

2017/08/29 05:00

overscrollですよね。最初それかなと思い、なんとなく元あった $E("data").onscroll=scroll; だけ追加してみたのですがダメでして、結局聞いてしまいました。 おお~!できました! そんなに複雑なやつを書かないとダメだったのですね。難関でした。 どうもありがとうございます!! 本当に助かりました。<(_ _)>
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問