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

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

新規登録して質問してみよう
ただいま回答率
85.35%
タブ

コンテンツの上下左右に参照用のメニューを設けることで、複数の要素やページの表示を可能にするユーザーインターフェイスパターンのこと。メニューをクリックすると、一つの要素が可視化され、他の要素は見えなくなる。

jQuery

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

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

2回答

711閲覧

タブ機能が突然動かなかくなった。

punchan36

総合スコア105

タブ

コンテンツの上下左右に参照用のメニューを設けることで、複数の要素やページの表示を可能にするユーザーインターフェイスパターンのこと。メニューをクリックすると、一つの要素が可視化され、他の要素は見えなくなる。

jQuery

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

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2021/04/25 07:22

編集2021/04/26 08:21

前提・実現したいこと

最近レスポンシブデザイン (css) を整えていたのですが、以前実装し終えたタブ機能が知らない内に機能しなくなっている事に気付きました。

3つのタブがあり、1つ目のタブとそのコンテンツがデフォルトで選択・表示されているのですが、2つ目以降のタブを押してもタブ・コンテンツ共に切り替わらず表示されない状態です。

該当のjsファイルは特別触っておりませんでしたので原因が分かりませんでした。エラーは特に発生しておりません。

該当のソースコード

users/show.html.erb

Rails

1<div class="tab-container"> 2 <ul class="tab-group"> 3 <li class="tab is-active">A</li> 4 <li class="tab">B</li> 5 <% if @current_user.id == @user.id %> 6 <li class="tab">C</li> 7 <% end %> 8 </ul> 9 10 <div class="panel-group"> 11 <div class="panel is-show"> 12 <!-- 中身省略。 --> 13 </div> 14 <div class="panel"> 15 <!-- 中身省略。 --> 16 </div> 17 <div class="panel"> 18 <!-- 中身省略。 --> 19 </div> 20 </div> 21</div>

tab.js

JS

1$(document).on('turbolinks:load', function() { 2 jQuery(function($){ 3 $('.tab').click(function(){ 4 $('.is-active').removeClass('is-active'); 5 $(this).addClass('is-active'); 6 $('.is-show').removeClass('is-show'); 7 // クリックしたタブからインデックス番号を取得 8 const index = $(this).index(); 9 // クリックしたタブと同じインデックス番号をもつコンテンツを表示 10 $('.panel').eq(index).addClass('is-show'); 11 }); 12 }); 13});

試したこと

1 . 該当のjsファイルに以下のコードを記述し改めて該当ページをリロードしますとアラートで「OK!」と表示されましたので、ファイル自体は読み込めているようです。

JS

1$(function() { 2 alert('OK!'); 3});

2 . Chromeのデベロッパーツールにて、該当のjsファイル内にブレークポイントを設定した上でタブの遷移を試みましたが、"Paused on breakpoint"の様に処理が止まる事がありませんでした。

3 . 他に使用しておりますjsファイルは処理が走っているようで、"Paused on breakpoint"の表示と共に処理が止まりました。
因みにそちらは「メッセージ機能において、最新のメッセージほど下に表示される為、ページ遷移した段階でスクロールバーを一番下に表示する」と言った内容です。

JS

1$(document).on('turbolinks:load', function() { 2 function scrollToEnd() { 3 const messageDetails = document.getElementById('scroll-inner'); 4 messageDetails.scrollTop = messageDetails.scrollHeight; 5 } 6 scrollToEnd() 7});

4 . application.html.erbにおいてjQueryのバージョンを変えてから試してみましたがダメでした。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> ↓ <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>

5 . 上記users/show.html.erb内に記載がありますis-showクラスをインデックス番号1番ではなく2番目に置いてみると、2ページ目のコンテンツが表示されました。ですのでコンテンツの中身に問題がある訳ではないのかなと思いました。
しかし他のタブをクリックする事による遷移は相変わらず出来ません。

こうして試してみますと該当のjsファイル内が怪しいのかなと思いましたが、記述ミスを見つける事が出来ませんでした。

どなたかご助言を頂けますと有難いです。

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

ruby 2.6.4p104
RubyGems 3.0.3
Rails 5.2.3
jquery 1.12.4

追記

tab.js1行目の$(document).on('turbolinks:load', function() {を消したり$(document).on('ready page:load', function() {に変えて試してみると、毎回ページをリロードすればタブが機能する様になりました。

turbolinksが絡んでいるのかなと思いますが、まだ解決には至りません。ページのリロードなしでも(他のページから遷移してきた状態でも)タブが動くよう改善したいです。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/04/25 09:16

CSSは弄ってないでしょうか?見えない要素が上にかぶさっていると、その見えない要素をクリックしてしまうのでその下の要素はクリックイベントが発生しません。 あとこの質問rails関係ないのでrailsのタグはつけない方がいいです。
punchan36

2021/04/25 09:43

有難うございます!レスポンシブ関連で弄ったcss周りを確認してみます。 少し時間がかかりそうですので、取り急ぎタグに関して編集させて頂きました。
punchan36

2021/04/25 12:19

原因がまだ分かりません。cssファイルを一つずつコメントアウトして試してみたのですが、状況が変わりません。 jsファイルで明確に"this"と要素を指定しても、cssによって被さってしまう(?)ような事があるのでしょうか…?
guest

回答2

0

自己解決

動かなかった tab.js に問題はなく、「試したこと」の3番に記載のありますjsファイルに問題がありました。

scroll.js

javascript

1$(document).on('turbolinks:load', function() { 2 function scrollToEnd() { 3 const messageDetails = document.getElementById('scroll-inner'); 4 messageDetails.scrollTop = messageDetails.scrollHeight; 5 } 6 scrollToEnd() 7});

jsファイルは名前が a, b, c, ...の順に並んでおり上から順に処理がされておりますが、動かなかった tab.js のファイル名を試しに a-tab.js に変えた所上手く動いたのをきっかけに原因が発覚しました。結局 scroll.js 内に問題があった為、その後に読み込まれた tab.js ファイルが機能しなかった、と言う事だったのです。

具体的には scroll.js にて getElementById('scroll-inner') とありますが、これは他の特定のビューのみで扱っている id でしたので、その後に tab.js が読み込まれても、このタブ機能を使いたいビュー上に 'scroll-inner' なる id を持つ要素は存在しない為、tab.js の中身は機能してくれない、と言う流れになっておりました。

scroll.js 自体は機能していた為に、まさかここに問題があるとは想像できず解決に時間がかかってしまいました。

解決方法と致しましては scroll.js 内でif文を用い、「ID(#scroll-inner)と言う要素の数が存在するかどうかを判別。無い場合は以下の処理は行わない。」と言う方法を用いました。

scroll.js

$(document).on('turbolinks:load', function() { function scrollToEnd() { if($('#scroll-inner').length){ const messageDetails = document.getElementById('scroll-inner'); messageDetails.scrollTop = messageDetails.scrollHeight; } } scrollToEnd() });

これにより、 scroll.js よりも下に tab.js ファイルを置いた場合でも全て機能する様になりました。
ファイル別に単体で見てみれば特に問題もなかったのですが、今回はTurbolinksを使用している為、逐一jsファイルが読み込まれている訳ではなく一度に上から順に読み込まれている、と言う点も考慮してコードを書かなくてはいけませんでした。

投稿2021/05/11 06:06

punchan36

総合スコア105

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

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

0

jQuery(function($){~});で囲んでいるのが原因ではないでしょうか。

これは DOMの読み込みが完了した時に実行されるので、
Turbolinks を使用している場合、期待通りに中身が実行されないのだろうと思います。

参考ページ
【Rails】turbolinksやAjaxの影響でjQueryが正常に動作しないとき - Qiita

(※Turbolinks は使ったことがないので見当違いかもしれません)

投稿2021/04/26 11:42

satokei

総合スコア1217

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

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

punchan36

2021/04/27 10:03

有難うございます! jQuery(function($){ の部分を以下のように変えてみましたが、それでもダメでした。 jQuery(document).on('turbolinks:load', function($){ また今回のタブ機能と同様に以下の記述から始まるjsファイルは他にもあるのですが、そちらは上手く機能しているのですよね…。 $(document).on('turbolinks:load', function() { jQuery(function($){ 因みにそちらはモーダルをフェードイン・フェードアウトさせる内容になっております。 出だしが同じ記述でも、なぜかタブだけ機能していない状況です…。
satokei

2021/04/28 08:26 編集

「jQuery(function($){~});」で囲むのをやめて、以下のようにしてみるという意図でした。 --------- $(document).on('turbolinks:load', function() {  $('.tab').click(function(){   ~コード~  }); }); ---------(全角スペースあり) ただ、CSSファイルだけを変更しただけで動作しなくなったのであれば、見当違いの回答だったかもしれません。 動作しなくなった前に変更したのはCSSだけなのか、もう一度確認してみてはいかがでしょうか?
punchan36

2021/04/28 10:16

失礼致しました。 そちらのコードで(当然スペースも半角にして)試してみましたが、やはり上手くいきません。 変更点を振り返って他の項目も試し、進捗が有り次第追記させて頂きます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問