🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Material Design

Material Designとは、Google社によって提唱されたデザインシステムです。デジタルにおける体験を構築するための見た目や振る舞いに関するガイドラインが含まれます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

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

jQuery

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

Q&A

解決済

1回答

1638閲覧

【javascript】ハンバーガーメニューが作動しない

yastinbieber

総合スコア49

Material Design

Material Designとは、Google社によって提唱されたデザインシステムです。デジタルにおける体験を構築するための見た目や振る舞いに関するガイドラインが含まれます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2021/02/25 04:09

編集2021/02/25 10:39

前提・実現したいこと

Railsをベースにwebアプリケーションを作っています。

material-dashboardを導入しており形をつくっているのですが、
ハンバーガーメニューのみ正しく作動しないので質問させてください。

発生している問題・エラーメッセージ

実際下記の画像のようなエラーが発生しております。

赤の波線の部分を見てみると.sidebarとかがあるのでハンバーガーメニューが出てこない理由がここにあるのかなと思っています。

イメージ説明

Uncaught TypeError: Cannot read property 'outerHTML' of undefined

試したこと

エラーを見て考えられるものを試してみたのですが、

赤の波線の部分を全て削除する

画像上だと少し分かりづらいですが、material-dashboard-min.jsにおいて.outerHTML,~に赤の波線が引かれており、ここを削除してみました。

これから
![イメイメージ説明a9c0b543d39f5237e22fd1f9daf21e2d.png)

.get(0)以降を削除↓
イメージ説明

これをすると、
新たにsintaxerrorが出てはしまうのですが、ハンバーガーメニューは作動します。
イメージ説明

一旦sintaxerrorを無視しようとしてそのまま本番環境へのデプロイを実行するとjsのエラーにより正常に完了しない状況です…

JSに関して知識不足が否めないのは承知ですが、
解決策もしくは助言いただけますと幸いです。

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

Rails5
ruby 2.5.1

一応applecation.js

//= require rails-ujs //= require activestorage // require turbolinks //= require jquery //= require jquery_ujs //= require jquery-ui //= require ./js/plugins/moment.min.js //= require ./js/core/popper.min.js //= require ./js/core/bootstrap-material-design.min.js //= require ./js/plugins/jquery.bootstrap-wizard.js //= require ./js/plugins/bootstrap-selectpicker.js //= require ./js/plugins/bootstrap-datetimepicker.min.js //= require ./js/plugins/bootstrap-tagsinput.js //= require ./js/plugins/jasny-bootstrap.min.js //= require ./js/plugins/bootstrap-notify.js //= require_tree . //= require autocomplete-rails

application.html.erb

<!DOCTYPE html> <html> <head> <title>Toreka</title> <%= csrf_meta_tags %> <%= csp_meta_tag %> <!--Payjp--> <script type="text/javascript" src="https://js.pay.jp/v1/"></script> <!--css,js--> <%= stylesheet_link_tag 'application', media: 'all' %> <%= javascript_include_tag 'application' %> <!--icon関連--> <link rel="apple-touch-icon" sizes="76x76" href="assets/apple-icon.png"> <%= favicon_link_tag('new_logo.png') %> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> <!-- Required meta tags --> <meta charset="utf-8"> <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport" /> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> <!-- Fonts and icons --> <link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700|Roboto+Slab:400,700|Material+Icons" /> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/latest/css/font-awesome.min.css" /> <link href="https://use.fontawesome.com/releases/v5.0.8/css/all.css" rel="stylesheet"> <!--スマホ対応--> <meta content='width=device-width, initial-scale=1.0, shrink-to-fit=no' name='viewport' /> </head> <body> ~~内容は割愛~~ <!--コレ書かないといけないぽい--> <script> $(document).ready(function() { $('#datatables').DataTable({ "pagingType": "full_numbers", "lengthMenu": [ [5, 10, 25, 50, -1], [5, 10, 25, 50, "All"] ], responsive: true, language: { search: "_INPUT_", searchPlaceholder: "Search...", } }); var table = $('#datatable').DataTable(); // Edit record table.on('click', '.edit', function() { $tr = $(this).closest('tr'); var data = table.row($tr).data(); alert('You press on Row: ' + data[0] + ' ' + data[1] + ' ' + data[2] + '\'s row.'); }); // Delete a record table.on('click', '.remove', function(e) { $tr = $(this).closest('tr'); table.row($tr).remove().draw(); e.preventDefault(); }); //Like record table.on('click', '.like', function() { alert('You clicked on Like button'); }); }); </script> <script> $(document).ready(function() { md.checkFullPageBackgroundImage(); setTimeout(function() { // after 1000 ms we add the class animated to the login/register card $('.card').removeClass('card-hidden'); }, 700); }); </script> </body> </html>

ちなみにjavascriptで読み込むもの

イメージ説明

navber

<nav class="navbar navbar-expand-lg navbar-transparent navbar-absolute fixed-top text-white"> <div class="container"> <div class="navbar-wrapper"> <a class="navbar-brand" href="javascript:;">Toreka</a> </div> <button class="navbar-toggler" type="button" data-toggle="collapse" aria-controls="navigation-index" aria-expanded="false" aria-label="Toggle navigation"> <span class="sr-only">Toggle navigation</span> <span class="navbar-toggler-icon icon-bar"></span> <span class="navbar-toggler-icon icon-bar"></span> <span class="navbar-toggler-icon icon-bar"></span> </button> <div class="collapse navbar-collapse justify-content-end"> <ul class="navbar-nav"> <li class="nav-item"> <a href="/" class="nav-link"> <i class="material-icons">dashboard</i> HOME </a> </li> <li class="nav-item "> <%= link_to "/mainpages/plan_comparison", class: "nav-link" do %> <i class="material-icons">public</i> プラン比較 <% end %> </li> <li class="nav-item "> <%= link_to new_user_session_path, class: "nav-link" do %> <i class="material-icons">fingerprint</i> Login <% end %> </li> <li class="nav-item "> <%= link_to new_user_registration_path, class: "nav-link" do %> <i class="material-icons">person_add</i> 無料新規登録 <% end %> </li> </ul> </div> </div> </nav>

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

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

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

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

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

guest

回答1

0

ベストアンサー

お力になれるかちょっとわからないのですが、
applecation.js
これファイルのどのあたりで読み込ませてます?
headerの辺りですか?それともfooterの辺ですか?
DOM要素よりもJSを先に読むとDOM要素が取得できずエラーを吐くことがあります。

あとは、プラグイン系はDOM要素の順番に規定があったりして、
「どういう順番でマークアップするかとか」
「どの要素に何のclassを付けるのか」
この辺りがマニュアルに書いてあると思うのですが読まれましたか?

コードが手元にあれば、jsであればエラーは解消できるんですが、
コード貼れない理由があったりしますか?
jsはプラグインで済ませてるみたいなので、CSSも恐らくデフォルトかと存じます。
せめて該当する箇所のhtmlだけでも貼っていただけませんでしょうか?

以下蛇足です。

jsが競合している可能性やバージョンの違い等でエラー吐いてる可能性もありますが、
htmlのコードが無いと検証も出来ませんので。

投稿2021/02/25 07:58

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yastinbieber

2021/02/25 08:05

コメントありがとうございます。 どこまで載せるべきかわからなかったのでこのような感じの内容を貼らせていただいてました。 改めてapplication.html.erbを載せさせていただきました。 application.js はheader付近に記載していると認識しております。 ちなみにDOM要素の順番などはお恥ずかしい限りですが認識しておりませんでした…
退会済みユーザー

退会済みユーザー

2021/02/25 08:38

JSはheaderで読み込みたいものと、footerで読み込みたいものに分ける。 もしくは全部footerで読ませる、というのがセオリーかなと。 今footerで読んでいるscriptをheaderに持っていくとエラーを吐くのではと推察します。 それよりもハンバーガーメニューのhtmlタグやclassが見たかったのですが、 割愛されている部分にありますでしょうか? 検証をお望みで無いようでしたら開示は不要でございますが。
yastinbieber

2021/02/25 09:02

詳しくありがとうございます。 申し訳ございません。 文字数の関係で全文を載せることが難しくてですね… もしよろしければで構いませんのでgithubの方ご覧いただけますと幸いです。 https://github.com/yastinbieber/git_toreka/blob/master/app/views/layouts/application.html.erb またハンバーガーメニュー箇所に関してですが、 https://torekabodymake.com こちらから確認いただけると嬉しいです。 如何せんどの箇所を指しているのかapplication.html.erb上だとわからなくてですね… 検証モードで確認いただけますと幸いです。 申し訳ございません。
退会済みユーザー

退会済みユーザー

2021/02/25 09:55 編集

検証だと要素が見当たらず、です。 Railsは習得してないんですが、github見るとサインインの判定が入っているように見えます。 これたぶんサインインしないと見れないやつですよね? githubで読みますが…お急ぎですか? サインインすれば見れるなら、登録するのもあり…なのか? ちょっと考えますw Railsの記述だけ消せば検証できそうな気もしますが、 買物行って飯作らないとなのでっ
yastinbieber

2021/02/25 10:42

申し訳ございません。 少し勘違いしてました。 navberの部分は別ページに書いていたのでした。 一番下に追記しましたのでご確認いただけますと幸いです (ギリギリ文字数入りました…) navber箇所がPCだと通常のnavberのような形をとり、スマホなどだとハンバーガーメニューになるように実装しております。 登録いただくのは流石に申し訳ないのでそこまでしていただかなくて大丈夫です…!! お気持ちだけで嬉しいです。
退会済みユーザー

退会済みユーザー

2021/02/25 11:51 編集

登録しようとしたのですがエラー吐きましたっ それはまた別の話なのですが。 大事なところはここですね。 `navbar_form=$("nav").find(".navbar-form").get(0).outerHTML,` この部分はこう書いてあります。 navbar_formという変数に次のモノを入れてください。 navタグの中で、 .navbar-formというclassを持つ要素を見つけて、 その要素をオブジェクトをDOMに変換して、 外側のHTMLタグから引っ張ってきてね。 outerHTMLで引っ張ってくると、 .navbar-formというクラスが付いた要素を含めて中にある要素も取得してきます。 長々と書きましたが、 navbar_formというclassを持つ要素が無いのでエラーを吐いてます。 追加で載せていただいたコードにも無いみたいですね。 参考URL bootstrap公式 ver4.2 https://getbootstrap.jp/docs/4.2/components/navbar/ Bootstrap 3 英語サイト※第三者サイトかもしれません。 https://www.w3schools.com/bootstrap/bootstrap_navbar.asp 調べた結果ですが、 .navbar-formというclassを採用していたのはbootstrap3で、 bootstrap4では残っていないclassのようです。 依存するパッケージの互換性の問題ってことになるのかな。 問題になっているclassを付けてどう動くかは試してみるか、さらにコード読み込まないとわかりません。 続きを読むと、$nav_contentのまえに入れてね、とあります。 $navbar_form=$(navbar_form) $navbar_form.insertBefore($nav_content) $nav_contentってなんですか?となりますが、 nav_content=$navbar.html(), nav_content='<ul class="nav navbar-nav nav-mobile-menu">'+nav_content+"</ul>" navbarのhtmlをモバイル用のulに突っ込んでね、とあります。 javascriptはエラーを吐くと止まってしまうので、モバイル用に組み直してくれません。 たぶんこの辺りがちゃんと動かない原因なんでしょうね。 bootstrap3の仕様にのっとりnavを作るか。 別のプラグイン使うか。 比較的簡単なので自分で書いてしまうか。 コードを動くようにmaterial-dashboard-min.jsを書き直すか…これは不毛な気がします。 どうされるかはお好みでどうぞっ 以下蛇足です。 material-dashboardはbootstrap3版とbootstrap4版があるようですが、 お使いのものは結局どちらだったのでしょうか。 SCSSファイルにMaterial Dashboard Pro - v2.1.2とあるので新しい方かな? bootstrapの変更に対応できてないのかなぁと思いつつ、 頭が疲れて限界なのでこのあたりでやめておきます。 ここまで原因が分かれば修正できる…はず。 あとは任せました!がんばってくださいっ
yastinbieber

2021/02/25 12:33

かなり丁寧にありがとうございます…!! なんとなくではありますが概要を理解することができました。 個人で考えていくとまた詰まってしまいそうですがなんとか頑張って解決していきたいと思います!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問