2017-03-17 31 views
0

我这里有下面的代码示例:jQuery是在点击动作时选择错误的元素

$(document).ready(function() { 
 

 
    $('.children a.txtlink').on("click", function(e) { 
 
    // toggle the icons when the text link is pressed 
 

 
    jQuery(this).parent().find('ul:first').toggle(); // toggle the next UL 
 

 
    if (jQuery(this).parent().find('i').hasClass("fa-chevron-down")) { 
 
     jQuery(this).parent().find('i').removeClass("fa-chevron-down").addClass("fa-chevron-up"); 
 
    } else { 
 
     jQuery(this).parent().find('i').removeClass("fa-chevron-up").addClass("fa-chevron-down"); 
 
    } 
 

 
    e.stopPropagation(); 
 
    e.preventDefault(); 
 
    }); 
 

 
    $('.children i.arrows').on("click", function(e) { 
 
    // toggle the icons when the chevron is pressed 
 

 
    jQuery(this).parent().find('ul:first').toggle(); // toggle the next UL 
 

 
    if (jQuery(this).hasClass("fa-chevron-down")) { 
 
     jQuery(this).removeClass("fa-chevron-down").addClass("fa-chevron-up"); 
 
    } else { 
 
     jQuery(this).removeClass("fa-chevron-up").addClass("fa-chevron-down"); 
 
    } 
 

 
    e.stopPropagation(); 
 
    e.preventDefault(); 
 
    }); 
 

 

 
});
.navbar_menu { 
 
    background: #222222; 
 
} 
 

 
.menu { 
 
    border-top: 1px solid #2D2D2D; 
 
} 
 

 
.menu ul { 
 
    padding: 0; 
 
    margin: 0; 
 
} 
 

 
.menu li { 
 
    list-style: none; 
 
    position: relative; 
 
} 
 

 
.menu li i { 
 
    padding-right: 3px; 
 
} 
 

 
.menu a.txtlink { 
 
    color: #ccc; 
 
    display: block; 
 
    font-size: 16px; 
 
    padding: 10px; 
 
    padding-right: 0; 
 
    border-bottom: 1px solid #2D2D2D; 
 
    text-decoration: none; 
 
} 
 

 
.menu a.txtlink:hover { 
 
    background: #111111; 
 
    color: #ffffff; 
 
    text-decoration: none; 
 
} 
 

 
.menu li.home a.txtlink::before { 
 
    content: '\f015'; 
 
    display: inline-block; 
 
    font: normal normal normal 14px/1 FontAwesome; 
 
    font-size: inherit; 
 
    text-rendering: auto; 
 
    -webkit-font-smoothing: antialiased; 
 
    -moz-osx-font-smoothing: grayscale; 
 
    transform: none; 
 
} 
 

 
.menu ul li { 
 
    position: relative; 
 
} 
 

 
.menu ul li.children i.arrows { 
 
    /* needed to show an icon in the mobile menu */ 
 
    position: absolute; 
 
    top: 0; 
 
    right: 0; 
 
    padding: 14px; 
 
    border-left: 1px solid #333333; 
 
    margin: 0; 
 
    cursor: pointer; 
 
    display: block; 
 
    color: #CCCCCC; 
 
} 
 

 
.menu .sub { 
 
    display: none; 
 
} 
 

 
.menu ul li ul li a.txtlink { 
 
    padding-left: 20px; 
 
} 
 

 
.menu ul li ul li ul li a.txtlink { 
 
    padding-left: 40px; 
 
} 
 

 
.menu i.arrows:hover { 
 
    background-color: #111111; 
 
} 
 

 
.menu ul li ul li { 
 
    background-color: #333333; 
 
}
<script src="https://code.jquery.com/jquery-3.2.0.min.js"></script> 
 
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" /> 
 
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" /> 
 
<nav class="navbar_menu"> 
 

 
    <div class="menu"> 
 
    <ul> 
 
     <li class="home"><a href="#" class="txtlink">Home</a></li> 
 
     <li class="children"> 
 
     <a href="#" class="txtlink"><i class="fa fa-folder"></i>Menu 1</a> 
 
     <ul class="sub"> 
 
      <li class="children"> 
 
      <a href="#" class="txtlink"><i class="fa fa-search"></i>Menu 1.1</a> 
 
      <ul class="sub"> 
 
       <li><a href="#" class="txtlink"><i class="fa fa-user"></i>Menu 1.1.1</a></li> 
 
       <li><a href="#" class="txtlink"><i class="fa fa-tag"></i>Menu 1.1.2</a></li> 
 
      </ul> 
 
      <i class="arrows fa fa-chevron-down"></i> 
 
      </li> 
 
      <li><a href="#" class="txtlink">Menu 1.2</a></li> 
 
      <li><a href="#" class="txtlink">Menu 1.3</a></li> 
 
      <li><a href="#" class="txtlink"><i class="fa fa-clock-o"></i>Menu 1.4</a></li> 
 
      <li><a href="#" class="txtlink"><i class="fa fa-search"></i>Menu 1.5</a></li> 
 
     </ul> 
 
     <i class="arrows fa fa-chevron-down"></i> 
 
     </li> 
 
     <li><a href="#" class="txtlink"><i class="fa "></i>Menu 2</a></li> 
 
     <li class="children"> 
 
     <a href="#" class="txtlink"><i class="fa fa-folder"></i>Menu 3</a> 
 
     <ul class="sub"> 
 
      <li class="children"> 
 
      <a href="#" class="txtlink"><i class="fa fa fa-search"></i>Menu 3.1</a> 
 
      <ul class="sub"> 
 
       <li><a href="#" class="txtlink"><i class="fa fa-user"></i>Menu 3.1.1</a></li> 
 
       <li><a href="#" class="txtlink"><i class="fa fa-bookmark-o"></i>Menu 3.1.2</a></li> 
 
      </ul> 
 
      <i class="arrows fa fa-chevron-down"></i> 
 
      </li> 
 
      <li><a href="#" class="txtlink"><i class="fa"></i>Menu 3.2</a></li> 
 
      <li><a href="#" class="txtlink"><i class="fa"></i>Menu 3.3</a></li> 
 
      <li><a href="#" class="txtlink"><i class="fa fa fa-calendar"></i>Menu 3.4</a></li> 
 
      <li><a href="#" class="txtlink"><i class="fa fa fa-search"></i>Menu 3.5</a></li> 
 
     </ul> 
 
     <i class="arrows fa fa-chevron-down"></i> 
 
     </li> 
 
     <li><a href="#" class="txtlink"><i class="fa fa-comments"></i>Menu 4</a></li> 
 
    </ul> 
 
    </div> 
 

 
</nav>

的问题是,当我用小箭头展开工作正常/缩小菜单和箭头交换正确。但是,当我点击文本元素时,菜单中的图标全部被箭头替换。

示例:使用箭头时,搜索图标将保留在菜单中。当我点击文本链接时,它被替换为箭头。

我想我在这里使用了一个错误的jquery选择器,但由于我对jquery很新,我无法修复它。那么我的错误是什么?

当我上的箭头

回答

1
  1. 单击使用.children(),而不是.find(),以确保只有直接 儿童纳入查询。
  2. 您的onclick事件可以与 合并为一个具有$('.children > a.txtlink, .children > i.arrows')的单个事件侦听器。再次,使用>直接子选择器到 确保我们不查询嵌套子节点。

它应该像现在预期:

$(document).ready(function() { 
 

 
    $('.children > a.txtlink, .children > i.arrows').on("click", function(e) { 
 
    // toggle the icons when the text link is pressed 
 

 
    jQuery(this).parent().children('ul:first').toggle(); // toggle the next UL 
 

 
    if (jQuery(this).parent().children('i.arrows').hasClass("fa-chevron-down")) { 
 
     jQuery(this).parent().children('i.arrows').removeClass("fa-chevron-down").addClass("fa-chevron-up"); 
 
    } else { 
 
     jQuery(this).parent().children('i.arrows').removeClass("fa-chevron-up").addClass("fa-chevron-down"); 
 
    } 
 

 
    e.stopPropagation(); 
 
    e.preventDefault(); 
 
    }); 
 
});
.navbar_menu { 
 
    background: #222222; 
 
} 
 

 
.menu { 
 
    border-top: 1px solid #2D2D2D; 
 
} 
 

 
.menu ul { 
 
    padding: 0; 
 
    margin: 0; 
 
} 
 

 
.menu li { 
 
    list-style: none; 
 
    position: relative; 
 
} 
 

 
.menu li i { 
 
    padding-right: 3px; 
 
} 
 

 
.menu a.txtlink { 
 
    color: #ccc; 
 
    display: block; 
 
    font-size: 16px; 
 
    padding: 10px; 
 
    padding-right: 0; 
 
    border-bottom: 1px solid #2D2D2D; 
 
    text-decoration: none; 
 
} 
 

 
.menu a.txtlink:hover { 
 
    background: #111111; 
 
    color: #ffffff; 
 
    text-decoration: none; 
 
} 
 

 
.menu li.home a.txtlink::before { 
 
    content: '\f015'; 
 
    display: inline-block; 
 
    font: normal normal normal 14px/1 FontAwesome; 
 
    font-size: inherit; 
 
    text-rendering: auto; 
 
    -webkit-font-smoothing: antialiased; 
 
    -moz-osx-font-smoothing: grayscale; 
 
    transform: none; 
 
} 
 

 
.menu ul li { 
 
    position: relative; 
 
} 
 

 
.menu ul li.children i.arrows { 
 
    /* needed to show an icon in the mobile menu */ 
 
    position: absolute; 
 
    top: 0; 
 
    right: 0; 
 
    padding: 14px; 
 
    border-left: 1px solid #333333; 
 
    margin: 0; 
 
    cursor: pointer; 
 
    display: block; 
 
    color: #CCCCCC; 
 
} 
 

 
.menu .sub { 
 
    display: none; 
 
} 
 

 
.menu ul li ul li a.txtlink { 
 
    padding-left: 20px; 
 
} 
 

 
.menu ul li ul li ul li a.txtlink { 
 
    padding-left: 40px; 
 
} 
 

 
.menu i.arrows:hover { 
 
    background-color: #111111; 
 
} 
 

 
.menu ul li ul li { 
 
    background-color: #333333; 
 
}
<script src="https://code.jquery.com/jquery-3.2.0.min.js"></script> 
 
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" /> 
 
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" /> 
 
<nav class="navbar_menu"> 
 

 
    <div class="menu"> 
 
    <ul> 
 
     <li class="home"><a href="#" class="txtlink">Home</a></li> 
 
     <li class="children"> 
 
     <a href="#" class="txtlink"><i class="fa fa-folder"></i>Menu 1</a> 
 
     <ul class="sub"> 
 
      <li class="children"> 
 
      <a href="#" class="txtlink"><i class="fa fa-search"></i>Menu 1.1</a> 
 
      <ul class="sub"> 
 
       <li><a href="#" class="txtlink"><i class="fa fa-user"></i>Menu 1.1.1</a></li> 
 
       <li><a href="#" class="txtlink"><i class="fa fa-tag"></i>Menu 1.1.2</a></li> 
 
      </ul> 
 
      <i class="arrows fa fa-chevron-down"></i> 
 
      </li> 
 
      <li><a href="#" class="txtlink">Menu 1.2</a></li> 
 
      <li><a href="#" class="txtlink">Menu 1.3</a></li> 
 
      <li><a href="#" class="txtlink"><i class="fa fa-clock-o"></i>Menu 1.4</a></li> 
 
      <li><a href="#" class="txtlink"><i class="fa fa-search"></i>Menu 1.5</a></li> 
 
     </ul> 
 
     <i class="arrows fa fa-chevron-down"></i> 
 
     </li> 
 
     <li><a href="#" class="txtlink"><i class="fa "></i>Menu 2</a></li> 
 
     <li class="children"> 
 
     <a href="#" class="txtlink"><i class="fa fa-folder"></i>Menu 3</a> 
 
     <ul class="sub"> 
 
      <li class="children"> 
 
      <a href="#" class="txtlink"><i class="fa fa fa-search"></i>Menu 3.1</a> 
 
      <ul class="sub"> 
 
       <li><a href="#" class="txtlink"><i class="fa fa-user"></i>Menu 3.1.1</a></li> 
 
       <li><a href="#" class="txtlink"><i class="fa fa-bookmark-o"></i>Menu 3.1.2</a></li> 
 
      </ul> 
 
      <i class="arrows fa fa-chevron-down"></i> 
 
      </li> 
 
      <li><a href="#" class="txtlink"><i class="fa"></i>Menu 3.2</a></li> 
 
      <li><a href="#" class="txtlink"><i class="fa"></i>Menu 3.3</a></li> 
 
      <li><a href="#" class="txtlink"><i class="fa fa fa-calendar"></i>Menu 3.4</a></li> 
 
      <li><a href="#" class="txtlink"><i class="fa fa fa-search"></i>Menu 3.5</a></li> 
 
     </ul> 
 
     <i class="arrows fa fa-chevron-down"></i> 
 
     </li> 
 
     <li><a href="#" class="txtlink"><i class="fa fa-comments"></i>Menu 4</a></li> 
 
    </ul> 
 
    </div> 
 

 
</nav>

1

首先,在尝试此并提供代码好工作。这就是说,有很多的方法来改善这一点,我没有时间进入,但已经取得了一些改动,以弥补这一差距:

  1. 使用变量来使代码更高效并更容易阅读。存储$(this)$(this).parent()是在你的代码
  2. 两个务必你的问题的心脏已经与$parent.find('i').hasClass('fa-chevron-down'),这是定位所有的父母下<i>元素,并在有阶级,这将是真实的。我很快就改变了这个只有找i.fa-chevron-down,但使用jQuery.children()也可能是一个更好的选择

  3. 为了避免$碰撞,这是拇指避免$(document).ready和使用jQuery(document).ready的一个很好的规则;那么$可以在内部使用,如果你调用named参数它;例如.ready(function($){

jQuery(document).ready(function($) { 
 
    $('.children a.txtlink').on("click", function(e) { 
 
    // toggle the icons when the text link is pressed 
 

 
    var $this = $(this), 
 
     $parent = $this.parent(), 
 
     $ul = $parent.find('ul:first'); 
 

 
    $ul.toggle(); // toggle the next UL 
 

 
    if ($parent.find('i.fa-chevron-down').length) { 
 
     $parent.find('i.fa-chevron-down').removeClass("fa-chevron-down").addClass("fa-chevron-up"); 
 
    } else { 
 
     $parent.find('i.fa-chevron-up').removeClass("fa-chevron-up").addClass("fa-chevron-down"); 
 
    } 
 

 
    e.stopPropagation(); 
 
    e.preventDefault(); 
 
    }); 
 

 
    $('.children i.arrows').on("click", function(e) { 
 
    // toggle the icons when the chevron is pressed 
 
    
 
    var $this = $(this), 
 
     $parent = $this.parent(), 
 
     $ul = $parent.find('ul:first'); 
 

 
    $ul.toggle(); // toggle the next UL 
 

 
    if ($this.hasClass("fa-chevron-down")) { 
 
     $this.removeClass("fa-chevron-down").addClass("fa-chevron-up"); 
 
    } else { 
 
     $this.removeClass("fa-chevron-up").addClass("fa-chevron-down"); 
 
    } 
 

 
    e.stopPropagation(); 
 
    e.preventDefault(); 
 
    }); 
 

 

 
});
.navbar_menu { 
 
    background: #222222; 
 
} 
 

 
.menu { 
 
    border-top: 1px solid #2D2D2D; 
 
} 
 

 
.menu ul { 
 
    padding: 0; 
 
    margin: 0; 
 
} 
 

 
.menu li { 
 
    list-style: none; 
 
    position: relative; 
 
} 
 

 
.menu li i { 
 
    padding-right: 3px; 
 
} 
 

 
.menu a.txtlink { 
 
    color: #ccc; 
 
    display: block; 
 
    font-size: 16px; 
 
    padding: 10px; 
 
    padding-right: 0; 
 
    border-bottom: 1px solid #2D2D2D; 
 
    text-decoration: none; 
 
} 
 

 
.menu a.txtlink:hover { 
 
    background: #111111; 
 
    color: #ffffff; 
 
    text-decoration: none; 
 
} 
 

 
.menu li.home a.txtlink::before { 
 
    content: '\f015'; 
 
    display: inline-block; 
 
    font: normal normal normal 14px/1 FontAwesome; 
 
    font-size: inherit; 
 
    text-rendering: auto; 
 
    -webkit-font-smoothing: antialiased; 
 
    -moz-osx-font-smoothing: grayscale; 
 
    transform: none; 
 
} 
 

 
.menu ul li { 
 
    position: relative; 
 
} 
 

 
.menu ul li.children i.arrows { 
 
    /* needed to show an icon in the mobile menu */ 
 
    position: absolute; 
 
    top: 0; 
 
    right: 0; 
 
    padding: 14px; 
 
    border-left: 1px solid #333333; 
 
    margin: 0; 
 
    cursor: pointer; 
 
    display: block; 
 
    color: #CCCCCC; 
 
} 
 

 
.menu .sub { 
 
    display: none; 
 
} 
 

 
.menu ul li ul li a.txtlink { 
 
    padding-left: 20px; 
 
} 
 

 
.menu ul li ul li ul li a.txtlink { 
 
    padding-left: 40px; 
 
} 
 

 
.menu i.arrows:hover { 
 
    background-color: #111111; 
 
} 
 

 
.menu ul li ul li { 
 
    background-color: #333333; 
 
}
<script src="https://code.jquery.com/jquery-3.2.0.min.js"></script> 
 
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" /> 
 
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" /> 
 
<nav class="navbar_menu"> 
 

 
    <div class="menu"> 
 
    <ul> 
 
     <li class="home"><a href="#" class="txtlink">Home</a></li> 
 
     <li class="children"> 
 
     <a href="#" class="txtlink"><i class="fa fa-folder"></i>Menu 1</a> 
 
     <ul class="sub"> 
 
      <li class="children"> 
 
      <a href="#" class="txtlink"><i class="fa fa-search"></i>Menu 1.1</a> 
 
      <ul class="sub"> 
 
       <li><a href="#" class="txtlink"><i class="fa fa-user"></i>Menu 1.1.1</a></li> 
 
       <li><a href="#" class="txtlink"><i class="fa fa-tag"></i>Menu 1.1.2</a></li> 
 
      </ul> 
 
      <i class="arrows fa fa-chevron-down"></i> 
 
      </li> 
 
      <li><a href="#" class="txtlink">Menu 1.2</a></li> 
 
      <li><a href="#" class="txtlink">Menu 1.3</a></li> 
 
      <li><a href="#" class="txtlink"><i class="fa fa-clock-o"></i>Menu 1.4</a></li> 
 
      <li><a href="#" class="txtlink"><i class="fa fa-search"></i>Menu 1.5</a></li> 
 
     </ul> 
 
     <i class="arrows fa fa-chevron-down"></i> 
 
     </li> 
 
     <li><a href="#" class="txtlink"><i class="fa "></i>Menu 2</a></li> 
 
     <li class="children"> 
 
     <a href="#" class="txtlink"><i class="fa fa-folder"></i>Menu 3</a> 
 
     <ul class="sub"> 
 
      <li class="children"> 
 
      <a href="#" class="txtlink"><i class="fa fa fa-search"></i>Menu 3.1</a> 
 
      <ul class="sub"> 
 
       <li><a href="#" class="txtlink"><i class="fa fa-user"></i>Menu 3.1.1</a></li> 
 
       <li><a href="#" class="txtlink"><i class="fa fa-bookmark-o"></i>Menu 3.1.2</a></li> 
 
      </ul> 
 
      <i class="arrows fa fa-chevron-down"></i> 
 
      </li> 
 
      <li><a href="#" class="txtlink"><i class="fa"></i>Menu 3.2</a></li> 
 
      <li><a href="#" class="txtlink"><i class="fa"></i>Menu 3.3</a></li> 
 
      <li><a href="#" class="txtlink"><i class="fa fa fa-calendar"></i>Menu 3.4</a></li> 
 
      <li><a href="#" class="txtlink"><i class="fa fa fa-search"></i>Menu 3.5</a></li> 
 
     </ul> 
 
     <i class="arrows fa fa-chevron-down"></i> 
 
     </li> 
 
     <li><a href="#" class="txtlink"><i class="fa fa-comments"></i>Menu 4</a></li> 
 
    </ul> 
 
    </div> 
 

 
</nav>