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

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

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

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

jQuery

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

Q&A

解決済

1回答

22399閲覧

アコーディオンの中のslick.jsが正常に初期化されない

aKusano

総合スコア3763

JavaScript

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

jQuery

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

0グッド

1クリップ

投稿2016/09/08 12:39

###前提・実現したいこと
・カルーセル表示にはslick.jsを使用している
・SPレイアウト(639px以下)ではアコーディオンパネルの中でカレンダーをカルーセル表示で見せる
・PCではアコーディオンなし/カルーセル表示なし
・ブラウザをリサイズしても上記表示を正常に切り替える

###発生している問題・エラーメッセージ
・ブラウザをリサイズした後アコーディオンを開くと、エラーが出てslick.jsの初期化が正しく行われない
エラー時のコンソール

###該当のソースコード

HTML

1<div class="js-accordion"> 2 <div class="js-acrTitle">アコーディオン開閉ボタン</div> 3 <div class="item js-acrBody"> 4 <div class="jy-calendar" data-month="9"> 5 <div class="cal"> 6 <table>省略</table> 7 </div><!-- /.cal --> 8 </div><!-- /jy-calendar --> 9 </div><!-- /.js-acrBody --> 10</div><!-- /.js-accordion -->

JavaScript

1//load 2$(window).on('load', function(){ 3 accordionPanel01(); //アコーディオン開閉(※slick初期化含む) 4}); 5 6//resize 7var timer = false; 8$(window).resize(function() { 9 if (timer !== false) { 10 clearTimeout(timer); 11 } 12 timer = setTimeout(function() { 13 resetAccordionPane01(); //アコーディオン表示リセット 14 initCalendar(); //カレンダー初期化(※slick初期化含む) 15 }, 200); 16}); 17 18/* カレンダー初期化処理 19-------------------------------------------------- */ 20function initCalendar(){ 21 var $cal = $(".jy-calendar"); 22 var d = new Date(); //日時情報を取得 23 var month = String(d.getMonth()+1); //当月を取得して文字列に変換 24 var w = $(window).width(); 25 var size = 639; 26 27 $cal.each(function(){ 28 var calMonthText = $(this).data("month"); //掲載月データを取得 29 var calArray = String(calMonthText).split(","); //掲載月データを配列に変換 30 var num = $.inArray(month, calArray); //当月が何番目にあるかを取得 31 if(num < 0){ 32 num = 0; //当月が無かったら最初の月 33 } 34 if (w <= size) { 35 $(this).slick({ //slick初期化 36 initialSlide: num //当月をスライドの1番目に設定 37 }); 38 } else { 39 $(this).unslick(); //slickを解除 40 } 41 }); 42} 43 44/* アコーディオン開閉処理 45-------------------------------------------------- */ 46function accordionPanel01() { 47 $(".js-acrTitle").each(function(){ 48 $(this).click(function(){ 49 50 var $eventTarget = $(this); 51 52 if($(this).hasClass("op")){ //既にアコーディオンが開いている時の処理 53 $(this).removeClass("op"); 54 $(this).next().stop().slideUp(400, function () { 55 return; 56 }); 57 }else{ //アコーディオンが閉じている時の処理 58 $(this).addClass("op"); 59 if($eventTarget.next().has(".jy-calendar")){ //アコーディオンの中にカレンダーがあったら 60 $eventTarget.next().find(".jy-calendar").slickSetOption(null, null, true); //slickの表示をリフレッシュ★ここでエラーが出る 61 } 62 }); 63 } 64 65 }); 66 }); 67} 68 69/* リサイズされた場合のアコーディオン表示処理 70-------------------------------------------------- */ 71function resetAccordionPane01() { 72 var w = $(window).width(); 73 var size = 639; 74 75 $(".js-accordion").each(function(){ 76 if (w <= size) { //SPの時 77 var display = $(this).find(".js-acrBody").css("display"); 78 if(display == "block"){//アコーディオンが開いていたら 79 $(this).find(".js-acrTitle").addClass("op"); //開閉アイコンの状態を設定 80 } 81 } else { //PCの時 82 //強制的にパネルを開く 83 $(this).find(".js-acrBody").show(); 84 $(this).find(".js-acrTitle").removeClass("op"); 85 } 86 }); 87} 88

###試したこと
最初はどういう状態だとうまく表示されないのか分からなかったので、エラーが再現されるタイミングを特定するためにコンソールの状態を確かめながらいろいろ試しました。

・初期表示の状態で開閉 →問題なし
・アコーディオンを開いた状態でリサイズ後、開閉 →問題なし
・アコーディオンを閉じた状態でリサイズ後、開閉 →エラーでslickが正しく表示されない
・おかしくなった状態で再読み込みした後、開閉 →問題なし

というところまでは突き止めました。
リサイズ後、アコーディオンを開こうとすると、

Uncaught TypeError: Cannot read property 'removeClass' of null

というエラーが出て、slickのリフレッシュをしている箇所のコードがコケるようです。

if($eventTarget.next().has(".jy-calendar")){...}のif文を取ってみても変わりません。

カレンダー入りのアコーディオンはページ内に複数ありますが、1つにしてみても変化なしです。

ここからどうやってバグの原因を突き止めたら良いのか分からず、完全に行き詰まってしまいました。。。
どこかロジックがおかしいところや、エラーの原因になりそうなところが無いか、どなたかお助けいただけますと助かります。。。m(_ _)m

###補足情報
MacのChromeとFirefoxでは確認していますがどちらも同じです。
その他不足情報等ありましたらご連絡ください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

initCalendar()$(this).slick(); / $(this).unslick(); をしていますが、そのたびに同じ要素に .slick() を実行していることになるのでは。

load時に1回 .slick() して、それを変数に保存し、hoge.slick('setPosition'); とすればリロードできませんか?

【slick.jsを利用していて、初期状態をdisplay:none;にしたらレイアウト崩れる | SSSSSN】
http://sssssn.com/archives/288

関連するライブラリや全て提示してもらって、動作が再現できればもう少し回答の精度が上げれると思います。

投稿2016/09/08 15:57

kei344

総合スコア69398

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

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

aKusano

2016/09/08 18:27

ご回答と参考サイトの情報ありがとうございました。 まさしくビンゴ!でした。 ずっと「accordionPanel01()」と「resetAccordionPane01() 」ばかり見てあーでもないこーでもないとやっていて、initCalender()の方はノーマークだったので、目からウロコでした!!! slick(), unslick()の処理を「.slick-initialized」の有無で分岐するようにしたら正常に表示されるようになりました。 重要なヒントをいただき、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問