0

シンプルなマルチレベル アコーディオン プラグインがあります。それは私にとってほぼ完璧です。

(function(jQuery){
     jQuery.fn.extend({  
         accordion: function() {       
            return this.each(function() {

                var $ul = $(this);

                if($ul.data('accordiated'))
                    return false;

                $.each($ul.find('ul, li>div'), function(){
                    $(this).data('accordiated', true);
                    $(this).hide();
                });

                $.each($ul.find('a'), function(){
                    $(this).click(function(e){
                        activate(this);
                        return void(0);
                    });
                });

                var active = $('.active');

                if(active){
                    activate(active, 'toggle');
                    $(active).parents().show();
                }

                function activate(el,effect){
                    $(el).parent('li').toggleClass('active').siblings().removeClass('active').children('ul, div').slideUp('fast');
                    $(el).siblings('ul, div')[(effect || 'slideToggle')]((!effect)?'fast':null);
                }

            });
        } 
    }); 
})(jQuery);

完全なコード - http://jsfiddle.net/SKfax/

このコードを少し作り直そうとしていますが、成功していません。親の「li」ではなく、「a」要素内でのみ toggleClass('.active') および removeClass('.active') が必要です

PS: '.active' クラスは、現在開いているセクションの見出しにのみ適用されます。

4

1 に答える 1

1

これは適切な論理的難問でしたが、うまく機能していると思います (誤解がある場合はお知らせください)。

JSFiddle

activateキーは、関数の最初のチェーンが最初のパスで実行されないようにすることだったと思います。したがって、ここに電話するとactivate

var active = $('.active');

if(active){
    activate(active, 'toggle');
    $(active).parents().show();
}

...兄弟をスライドさせてactiveクラスを切り替えるチェーンを実行したくありません。

activateまた、以下で説明するように機能を微調整しました。

function activate(el,effect){

    //only do this if no effect is specified (i.e. don't do this on the first pass)
    if (!effect) {
        $(el)
             .toggleClass('active') //first toggle the class of the clicked element (i.e. the 'a' tag)
             .parent('li') //now we go up the DOM to the parent 'li'
             .siblings() //get the sibling li's
             .find('a') //get the 'a' tags below them (assuming there are no 'a' tags in the content text!)
             .removeClass('active') //remove active class from these 'a' tags
             .parent('li')
             .children('ul, div')
             .slideUp('fast'); //and hide the sibling content
    }

    //I haven't touched this
    $(el).siblings('ul, div')[(effect || 'slideToggle')]((!effect)?'fast':null);
}
于 2013-06-02T17:28:17.823 に答える