2017-03-17 77 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>