###前提・実現したいこと
・カルーセル表示には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では確認していますがどちらも同じです。
その他不足情報等ありましたらご連絡ください。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/09/08 18:27