简体   繁体   English

在子孙同班的情况下如何更改班级JQUERY

[英]How to change class where children and grandchildren are same class JQUERY

I am developing one menu and I want to changed the icon when somebody click it. 我正在开发一个菜单,当有人单击它时我想更改其图标。 I have changed the icon but all children that they have change the icon too, due to they share same class. 我已经更改了图标,但由于他们共享同一班级,因此所有孩子也更改了图标。 The structure is similar to: 结构类似于:

在此处输入图片说明

And when click it we can see. 当单击它时,我们可以看到。 在此处输入图片说明

Menu selected has changed but its children too. 所选菜单已更改,但其子菜单也已更改。 The problem is that icon change because the class name and this class name are the same in children and grandchildren. 问题是图标更改,因为在子代和孙代中,类名和该类名相同。

Html: HTML:

<li id="formularioMenu:j_id244" role="menuitem" class="active-menu-parent">
    <a href="#" class="menulink ripplelink active-menu active-menu-restore">
        <i class="icon-null"></i>
        <i class="icon-folder-empty"></i> 
        Foo2
        <i class="icon-add Fright Fs16"></i>
    </a>
    <ul class="menu-level-1 active-menu active-menu-restore" role="menu">
        <li id="formularioMenu:j_id245" role="menuitem">
            <a class="menulink ripplelink" href="http://localhost:8080/foo21.xhtml">
            <i class="icon-null"></i>
            <i class="icon-doc-text-1"></i>
            Foo2.1</a>
        </li>
        <li id="formularioMenu:j_id246" role="menuitem">
            <a class="menulink ripplelink" href="http://localhost:8080/foo22.xhtml">
            <i class="icon-null"></i>
            <i class="icon-doc-text-1"></i>
            Foo2.2</a>
        </li>
        <li id="formularioMenu:j_id247" role="menuitem">
            <a class="menulink ripplelink" href="http://localhost:8080/foo23.xhtml">
            <i class="icon-null"></i>
            <i class="icon-doc-text-1"></i>
            Foo2.3</a>
        </li>
        <li id="formularioMenu:j_id248" role="menuitem">
            <a class="menulink ripplelink" href="http://localhost:8080/foo24.xhtml">
            <i class="icon-null"></i>
            <i class="icon-doc-text-1"></i>
            Foo2.4</a>
            <i class="icon-add Fright Fs16"></i>
            </a>
            <ul class="menu-level-2" role="menu">
            ...
            </ul>
        </li>
        <li id="formularioMenu:j_id249" role="menuitem">
            <a class="menulink ripplelink" href="http://localhost:8080/foo25.xhtml">
            <i class="icon-null"></i>
            <i class="icon-doc-text-1"></i>
            Foo2.5</a>
            <i class="icon-add Fright Fs16"></i>
            </a>
            <ul class="menu-level-2" role="menu">
            ...
            </ul>
        </li>
        <li id="formularioMenu:j_id250" role="menuitem">
            <a href="#" class="menulink ripplelink">
            <i class="icon-null"></i>
            <i class="icon-folder-empty"></i> 
            Foo2.6          
        </li>
        ...
    </ul>
</li>

With this class="icon-add Fright Fs16" I change the icon image. 有了这个class =“ icon-add Fright Fs16”,我更改了图标图像。 I must alternate between icon-add and icon-minus class. 我必须在icon-add和icon-minus类之间切换。

Part of my JQuery code, the "logo" variable does the action to change name class. 我的JQuery代码的一部分,“徽标”变量执行更改名称类的操作。 A part to change from Minus to Add and another part to reverse : 从减号更改为加号的部分,向后反转的另一部分:

bindEvents: function() {
    var $this = this;

    if(this.mobile) {
        this.menuWrapper.css('overflow-y', 'auto');
    }
    else {
        this.menuWrapper.perfectScrollbar({suppressScrollX: true});
    }

    this.menulinks.on('click',function(e) {
        var menuitemLink = $(this),
        menuitem = menuitemLink.parent();

        if(menuitem.hasClass('active-menu-parent')) {
            var logo = menuitem.find('i.icon-minus');

            if(logo.hasClass('icon-minus')){                    
                logo.removeClass('icon-minus');
                logo.addClass('icon-add');
            }

            menuitem.removeClass('active-menu-parent');
            menuitemLink.removeClass('active-menu active-menu-restore').next('ul').removeClass('active-menu active-menu-restore');
            $this.removeMenuitem(menuitem.attr('id'));
        }
        else {
            var activeSibling = menuitem.siblings('.active-menu-parent');
            if(activeSibling.length) {
                activeSibling.removeClass('active-menu-parent');
                $this.removeMenuitem(activeSibling.attr('id'));

                activeSibling.find('ul.active-menu,a.active-menu').removeClass('active-menu active-menu-restore');
                activeSibling.find('li.active-menu-parent').each(function() {
                    var menuitem = $(this);
                    menuitem.removeClass('active-menu-parent');
                    $this.removeMenuitem(menuitem.attr('id'));
                });
            }

            var logo = menuitem.find('i.icon-add');

            if(logo.hasClass('icon-add')){                  
                logo.removeClass('icon-add');
                logo.addClass('icon-minus');
            }

            menuitem.addClass('active-menu-parent');
            menuitemLink.addClass('active-menu').next('ul').addClass('active-menu');
            $this.addMenuitem(menuitem.attr('id'));
        }

        if(menuitemLink.next().is('ul')) {
            e.preventDefault();
        }
        else {
            $this.menuWrapper.removeClass('showmenu');
            $this.mobileMenuButton.removeClass('MenuClose');
        }

        $this.saveMenuState();

        if(!$this.mobile) {
            $this.menuWrapper.perfectScrollbar("update");
        }
    });

When function find its, gets alls children and grandchildren with icon-add class. 当函数找到它时,用图标添加类将所有子孙都带走。 So how can I change only the menu selected? 那么,如何仅更改所选菜单?

Regards. 问候。

Finally I gets my goals. 最终我实现了目标。 How I can't find the specific element, I decided iterate all children level and when I gets the element that I want, I remove old class and insert new class. 我找不到特定的元素,因此决定迭代所有子级,并在获得所需的元素时删除旧类并插入新类。 Copy the code, my modification is between //jmf comments. 复制代码,我的修改是在// jmf注释之间。 One part to change + to - and another part to change - to +. 一部分将+更改为-,另一部分将更改为+。

bindEvents: function() {
    var $this = this;

    if(this.mobile) {
        this.menuWrapper.css('overflow-y', 'auto');
    }
    else {
        this.menuWrapper.perfectScrollbar({suppressScrollX: true});
    }

    this.menulinks.on('click',function(e) {
        var menuitemLink = $(this),
        menuitem = menuitemLink.parent();

        if(menuitem.hasClass('active-menu-parent')) {
            //jmf
            var enlace = menuitem.children();

            if(enlace.length){
                var vinculo = enlace.first();

                if(vinculo.length){
                    var lineasVinculo = vinculo.children();

                    if(lineasVinculo.length){
                        var logo = lineasVinculo.last();

                        if(logo.length){
                            if(logo.hasClass('icon-minus')){
                                logo.removeClass('icon-minus');
                                logo.addClass('icon-add');                                  
                            }                                                               
                        }                           
                    }                       
                }
            }
            //fin jmf

            menuitem.removeClass('active-menu-parent');
            menuitemLink.removeClass('active-menu active-menu-restore').next('ul').removeClass('active-menu active-menu-restore');
            $this.removeMenuitem(menuitem.attr('id'));
        }
        else {
            var activeSibling = menuitem.siblings('.active-menu-parent');
            if(activeSibling.length) {
                activeSibling.removeClass('active-menu-parent');
                $this.removeMenuitem(activeSibling.attr('id'));

                activeSibling.find('ul.active-menu,a.active-menu').removeClass('active-menu active-menu-restore');
                activeSibling.find('li.active-menu-parent').each(function() {
                    var menuitem = $(this);
                    menuitem.removeClass('active-menu-parent');
                    $this.removeMenuitem(menuitem.attr('id'));
                });
            }               

            //jmf
            var enlace = menuitem.children();

            if(enlace.length){
                var vinculo = enlace.first();

                if(vinculo.length){
                    var lineasVinculo = vinculo.children();

                    if(lineasVinculo.length){
                        var logo = lineasVinculo.last();

                        if(logo.length){
                            if(logo.hasClass('icon-add')){
                                logo.removeClass('icon-add');
                                logo.addClass('icon-minus');                                    
                            }                                                               
                        }                           
                    }                       
                }
            }    
            //fin jmf

            menuitem.addClass('active-menu-parent');
            menuitemLink.addClass('active-menu').next('ul').addClass('active-menu');
            $this.addMenuitem(menuitem.attr('id'));
        }

        if(menuitemLink.next().is('ul')) {
            e.preventDefault();
        }
        else {
            $this.menuWrapper.removeClass('showmenu');
            $this.mobileMenuButton.removeClass('MenuClose');
        }

        $this.saveMenuState();

        if(!$this.mobile) {
            $this.menuWrapper.perfectScrollbar("update");
        }
    });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM