teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

検証追記

2016/07/19 10:02

投稿

orange0190
orange0190

スコア1698

answer CHANGED
@@ -67,4 +67,9 @@
67
67
  });
68
68
  });
69
69
  ```
70
- 上記は検証していませんので、動かないかもしれません。(これから検証します)
70
+ 上記は検証していませんので、動かないかもしれません。(これから検証します)
71
+
72
+ 検証結果
73
+ ---
74
+ [レスポンシブ時にPC/SPで、アコーディオンメニューの挙動を変えたい。検証](https://jsfiddle.net/5tgsarqr/)
75
+ 検証した結果、動作するかと思います。

1

追記

2016/07/19 10:02

投稿

orange0190
orange0190

スコア1698

answer CHANGED
@@ -1,5 +1,5 @@
1
1
  以下のようにしてみてはいかがでしょうか。
2
- ```PHP
2
+ ```javascript
3
3
  // アコーディオンメニュー
4
4
  $(window).on('load resize', function(){
5
5
  $('body').on( 'click','.click-btn', function( ev ) {
@@ -26,4 +26,45 @@
26
26
  } );
27
27
  } );
28
28
  ```
29
- `.hover()`は`.on()`とかと同じようにイベントを設定しているだけですので、元のコードでは`over_flg`は更新されません。
29
+ `.hover()`は`.on()`とかと同じようにイベントを設定しているだけですので、元のコードでは`over_flg`は更新されません。
30
+
31
+ 追記
32
+ ---
33
+ 私なら以下のようにするかと思います。
34
+ ```javascript
35
+ $(function(){
36
+
37
+ // 各イベントで利用するためにこの位置で定義
38
+ var over_flg = true;
39
+
40
+ $(document).on("click", ".click-btn", function(ev){
41
+ // イベントの伝播を防ぐ
42
+ ev.stopPropagation();
43
+
44
+ // ev.target がイベントの起こった要素
45
+ var l = $( ev.target ).parents( '#globalMenu' ).length;
46
+
47
+ if ( l > 0 ) { // メニュー内のイベントか判定
48
+ // ここではPC・SPは関係ないのでクラスの付与・除去のみを行う
49
+ $( '.child-list' ).toggleClass('open01');
50
+ }
51
+ });
52
+
53
+ // ここでhoverイベントを設定(PCのみ動作する)
54
+ $('.product-child .click-btn,.child-list').hover(function(){
55
+ over_flg = true;
56
+ }, function(){
57
+ over_flg = false;
58
+ });
59
+
60
+ // メニュー領域外をクリックしたらメニューを閉じる
61
+ $('body').click(function() {
62
+ if(window.innerWidth > 768){ // ウィンドウサイズからPC・SPを判定
63
+ if (over_flg == false) {
64
+ $('.child-list').removeClass('open01');
65
+ }
66
+ }
67
+ });
68
+ });
69
+ ```
70
+ 上記は検証していませんので、動かないかもしれません。(これから検証します)