初めましてこんにちは。
javascriptの.slideToggle()が何度も実行されて、開閉が何度も起こる事態について質問させていただきます。
これは、何度もクリックしたときにその回数分開くのをstop()で止めたいという種類のものではありません。
したいことは、サイドナビゲーションを、userのスマホやタブレットとそれ以外によって条件分岐をし、更に画面サイズ(800px)で条件分岐をします。800px未満の場合は、サイドナビゲーションのSIDENAVI以外の部分を閉じた状態にし、SIDENAVI の部分をクリックしたとき、それ以下のリスト部分を開閉させ、800p以上の場合は、全部開いた状態にします。
閉じた状態が初期状態の場合(800px未満)は、.oc-markの文字を、リストが閉じているときは"開"、開いているときは"閉"にします。開いた状態が初期状態の場合(800px以上)は、クリックで開閉させず、"開"も"閉"も表示させません。(開、閉の非表示は、javascriptを使わず、cssで実装しています。)また、スマホが回転されたときやPCでブラウザの幅をリサイズされたときに、画面サイズを再度取得し、それに合わせてコンテンツを表示しています。
問題は現在の状態だと、
スマホの場合、回転させていない場合は意図通りクリックで開閉してくれるのですが、一度画面を回転させると、開いて閉じる、という動作になり、**二度目回転させると、開いて閉じて開く、**という状態になります。さらに何度も回転させていると、一度のクリックで、その回転させた回数分開閉を繰り返します。
PCの場合は、どこかの時点で画面をリサイズし、800px未満に一度なると、そのあと画面を広げて800px以上にして、サイドメニューが常に表示される状態になってほしくても、開いた状態にはなるのですが、クリックで開閉されてしまいます。さらにこちらも一度のクリックで何度も開閉を繰り返すようになります。
javascriptのコメントアウトの部分は、この何度も開閉する状態を回避するために、回転やリサイズされた際に強制的にリロードさせていたのですが、今回、ビデオやオーディオといったコンテンツを配信することにしましたので、スマホの回転や画面サイズ変更のたびにリロードしていると、再生していたコンテンツも一緒にリロードされてしまい、継続的に再生できない事態になりますので、リロードさせることができなくなりました。
初心者の域を出ておらず、効率的なコードの組み方がわからないため、大変恥ずかしい状態ではありますが、解決策がありましたら、ご教授いただきたいと思い、投稿いたしました。
下記が使用しているHTMLとjavascriptです。
どうぞよろしくお願いいたします。
HTML
1<nav class="side-navigation"> 2 <h2> 3 <span class="toggle-text">SIDENAVI 4 <span class="oc-mark">開</span> 5 </span> 6 </h2> 7 <ul class="sidenavi-contents"> 8 <li> 9 <h3>見出し</h3> 10 </li> 11 <li class="sidenavi-list"> 12 <a>りすと1</a> 13 </li> 14 <li class="sidenavi-list"> 15 <a>りすと2</a> 16 </li> 17 <li class="sidenavi-list"> 18 <a>りすと3</a> 19 </li> 20 <li class="sidenavi-list"> 21 <a>りすと4</a> 22 </li> 23 <li class="sidenavi-list"> 24 <a>りすと5</a> 25 </li> 26 </ul> 27</nav>
javascript
1 2$(document).ready(function() { 3 "use strict"; 4 5 var $ua = navigator.userAgent; 6 $(function() { 7 8 if ($ua.indexOf('iPhone') > 0 || $ua.indexOf('iPad') > 0 || $ua.indexOf('iPod') > 0 || $ua.indexOf('android') > 0 || $ua.indexOf('BlackBerry') > 0 || $ua.indexOf('windows Phone') > 0 || $ua.indexOf('NOKIA') > 0 || /Mobile.*Firefox/.test($ua)) { 9 10 $(window).on("load orientationchange", Fitsizem); 11 12 function Fitsizem() { 13 var _width = $(window).width(); 14 15 if (_width <= 800) { 16 17 $(".side-navigation .sidenavi-contents").hide(); 18 var flg = "close"; 19 20 $(".side-navigation h2").click(function() { 21 var snavtglpart = $(".side-navigation .sidenavi-contents"); 22 var sntexchange = $(".side-navigation h2 .toggle-text .oc-mark"); 23 24 snavtglpart.slideToggle(); 25 26 if (flg === "close") { 27 sntexchange.text("閉"); 28 flg = "open"; 29 } else { 30 sntexchange.text("開"); 31 flg = "close"; 32 } 33 }); 34 35 } else { 36 $(".side-navigation .sidenavi-contents").show(); 37 } 38 } 39 /* 40 var timer; 41 $(window).on("orientationchange", function() { 42 clearTimeout(timer); 43 timer = setTimeout(function() { 44 location.reload(true); 45 }, 100); 46 }); 47 */ 48 49 } else { 50 51 $(window).on("load resize", Fitsizepc); 52 53 function Fitsizepc() { 54 var _width = $(window).width(); 55 56 if (_width <= 800) { 57 58 $(".side-navigation .sidenavi-contents").hide(); 59 var flg = "close"; 60 61 $(".side-navigation h2").click(function() { 62 var snavtglpart = $(".side-navigation .sidenavi-contents"); 63 var sntexchange = $(".side-navigation h2 .toggle-text .oc-mark"); 64 65 snavtglpart.slideToggle(); 66 67 if (flg === "close") { 68 sntexchange.text("閉"); 69 flg = "open"; 70 } else { 71 sntexchange.text("開"); 72 flg = "close"; 73 } 74 }); 75 76 } else { 77 $(".side-navigation .sidenavi-contents").show(); 78 } 79 /* 80 var timer = false; 81 $(window).resize(function() { 82 if (timer !== false) { 83 clearTimeout(timer); 84 } 85 timer = setTimeout(function() { 86 location.reload(true); 87 }, 200); 88 }); 89 */ 90 91 } 92 } 93 }); 94});

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