2016-06-17 49 views
1

EDIT:コードを少しきれいにして問題を絞りました。jQuery slideDownは動的に割り当てられたIDを持つ要素では機能しません

私はWordpressサイトで作業しています。携帯のメニューにドロップダウンを組み込もうとしています。つまり、既存の要素にクラスとIDを割り当てるためにjQueryを使用する必要があります。私はこのコードが既にpremade HTMLで動作しますが、動的に作成されたIDで失敗します。ここで

コードです:

... 
var menuCount = 0; 
var contentCount = 0; 
//find the mobile menu items 
var submenus = $('[title="submenu"]'); 
if (submenus.length && submenus.parent('.fusion-mobile-nav-item')) { 
    console.log(submenus); 
    submenus.addClass('dropdown-title').append('<i id="dropdown-angle" class="fa fa-angle-down" aria-hidden="true"></i>'); 
    submenus.each(function() { 
     $(this).attr("href", "#m" + menuCount++); 
    }) 
    var content = submenus.parent().find('ul.sub-menu'); 
    content.addClass('dropdown-content'); 
    content.each(function() { 
     $(this).attr("id", "m" + contentCount++); 
    }) 
} 

$(document).on('click', '.dropdown-title', function(e) { 
    var currentAttrValue = $(this).attr('href'); 

    if ($(e.target).is('.d-active') || $(e.target).parent('.dropdown-title').is('.d-active')) { 
     $(this).removeClass('d-active'); 
     $(currentAttrValue).slideUp(300).removeClass('d-open'); 
    } else { 
     $('.dropdown-title').removeClass('d-active'); 
     $('.dropdown-content').slideUp(300).removeClass('d-open'); 
     $(this).addClass('d-active'); 
     console.log($(currentAttrValue)); 

     //THIS LINE FAILS 
     $(currentAttrValue).slideDown(300).addClass('d-open'); 
    } 

    e.preventDefault(); 

}); 

私は$(document).on(...)を使用して、クラスdropdown-titleを持つ要素を登録しましたが、私は、カスタムID年代に要素を登録するために何をする必要があるかを把握することはできません。私はイベントコールバックを.eachの関数の中に入れようとしましたが、私はトリガするカスタムイベントを作ろうとしましたが、それらのどれもが2番目のコード行をトリガすることはありません。そこコンソールにはエラーはません、と私は、この取得セレクタログイン慰めるとき:

[UL#m0.sub-menu.dropdownコンテンツ、コンテキスト:ドキュメント、セレクタ: "#1 M0"] を: UL#1 m0.sub-menu.dropdownコンテンツ コンテキスト: 文書 長さ: 1セレクタ : "#1 M0" プロト : オブジェクト[0]

jQueryはその要素があることを知っていますが、登録方法を理解できません。あるいは、私が考えていないことかもしれません。わかりません。

答えて

1

要素を動的に作成する場合は、要素を作成した後に.onの「クリック」を割り当てる必要があります。ページが読み込まれる代わりにIDとクラスを追加した後に投稿した 'クリック時の'コールバックコードを宣言するだけで、.dropdown-titleクラスの要素にアタッチされます。

チェックこのjsFiddle:https://jsfiddle.net/6zayouxc/

EDIT:編集したJSコードは動作します...またあなたのHTMLやCSSといくつかの問題がある可能性がありますが、あなたはあなたのサブメニューを隠していますか?それらを透明にしていないことを確認してください。

+0

私に例を教えてください。私は上手く理解できていない気がします。私はコンテンツをクリックできるようにしたくない。タイトルだけ。 –

+0

はい、ドロップダウンコンテンツのCSSに 'display:none'を追加して非表示にしてから、jQueryアニメーションが残ります。私が混乱させているのは、アニメーションを取り出しても、要素にd-openクラスを追加することさえできないからです。 –

0

要素の代わりに属性の関数を呼び出そうとしています。 $(this).slideDown(300).addClass('d-active');が必要です(前に$(this).addClass('d-active');は必要ありません)。

+0

いいえ、そのIDの要素を選択する必要があります。 $(これ)は、ドロップダウンタイトルであり、ドロップダウンコンテンツではありません。 –

+0

hrefの値は#m0のようなものなので、jQueryで選択すると自動的にIdに変換されます –

+0

これは、次のようにすることができます: '$(this).find( '#' + currentAttrValue).slideDown(...)'シャープには分かりません) – user37741

0

内側submenus.eachループにコールバックリスナーを追加します。

クラスdropdown-titleを動的に追加しているため、DOMロード時には利用できませんでした。そのため、イベントリスナーはこれらのelemntに関連付けられていませんでした。

var menuCount = 0; 
var contentCount = 0; 
//find the mobile menu items 
var submenus = $('[title="submenu"]'); 
if (submenus.length && submenus.parent('.fusion-mobile-nav-item')) { 
    console.log(submenus); 
    submenus.addClass('dropdown-title').append('<i id="dropdown-angle" class="fa fa-angle-down" aria-hidden="true"></i>'); 
    submenus.each(function() { 
     $(this).attr("href", "#m" + menuCount++); 

     // add callback here 
     $(this).click(function(e) { 
      var currentAttrValue = $(this).attr('href'); 

      if ($(e.target).is('.d-active') || $(e.target).parent('.dropdown-title').is('.d-active')) { 
       $(this).removeClass('d-active'); 
       $(currentAttrValue).slideUp(300).removeClass('d-open'); 
      } else { 
       $('.dropdown-title').removeClass('d-active'); 
       $('.dropdown-content').slideUp(300).removeClass('d-open'); 
       $(this).addClass('d-active'); 
       console.log($(currentAttrValue)); 

       $(currentAttrValue).slideDown(300).addClass('d-active'); 
      } 

      e.preventDefault(); 

     }); 


    }) 
    var content = submenus.parent().find('ul.sub-menu'); 
    content.addClass('dropdown-content'); 
    content.each(function() { 
     $(this).attr("id", "m" + contentCount++); 
    }) 
} 
+0

問題は 'dropdown-title'イベントを発生させないので、クリックするたびにうまくいきます。問題はそのイベントの中で、私がドロップダウン・コンテンツ要素を割り当てたIDをjQueryに登録させることです。 –

0

私の問題は、jQueryのモバイルメニューと私はjQueryのに見つかっ一つだそのIDを検索したときにデスクトップメニューが最初にロードされているデスクトップメニュー、両方に追加されていることであるが判明。だから私の疑惑については完全に間違っていたことが判明しました。

関連する問題