[英]Disable click from registering on parent li after child ul is clicked
var treeview = document.querySelectorAll(".treeview");
var submenu = document.querySelectorAll(".treeview ul");
for (var i=0; i<treeview.length; i++;) {
treeview[i].addEventListener("click", function(e) {
this.classList.toggle("menu-open");
e.stoppropagation();
});
當單擊li時,打開子菜單(treeview-menu),但是如果單擊了子ul鏈接,則由於單擊被注冊,因此它將關閉菜單。
<li class="treeview">
<a href="#">
<i class="fa fa-dashboard"></i> <span>Dashboard</span>
</a>
<ul class="treeview-menu">
<li><a href="index.html"><i class="fa fa-circle-o"></i> Dashboard v1</a></li>
<li class="active"><a href="index2.html"><i class="fa fa-circle-o"></i> Dashboard v2</a></li>
</ul>
</li>
我的失敗嘗試如下:
var treeview = document.querySelectorAll(".treeview");
var submenu = document.querySelectorAll(".treeview ul");
for (var i=0; i<treeview.length; i++) {
treeview[i].addEventListener("click", function(e) {
this.classList.toggle("menu-open");
e.stoppropagation();
submenu[i].addEventListener("click", function() {
e.stoppropagation();
})
});
為我工作
var treeview = document.querySelectorAll(".treeview");
var submenu = document.querySelectorAll(".treeview ul");
for (var i=0; i<treeview.length; i++) {
treeview[i].addEventListener("click", function() {
this.classList.toggle("menu-open");
for (var x=0; x<treeview.length; x++){
submenu[x].addEventListener("click", function(e) {
e.stopPropagation();
})
}
});
}
您的代碼中存在幾個問題:
stopPropagation
的拼寫錯誤 i
,該i
已經超過了treeview
列表的長度。 請注意,在完成任何單擊之前,循環已完成。 因此,在點擊處理程序中, i
與循環的某個迭代無關。 您可以通過給i
塊范圍來解決此問題(使用let
) e
對象,因為您沒有將其定義為參數 .treeview
都有一個ul
子對象,否則相關子菜單的索引將不對應。 除了最后一點,以下內容在您的特定示例中有效:
for (let i=0; i<treeview.length; i++) { // block scope
treeview[i].addEventListener("click", function(e) {
this.classList.toggle("menu-open");
e.stopPropagation(); // Spelling!
submenu[i].addEventListener("click", function(e) { // <-- pass e
e.stopPropagation(); // Spelling!
});
});
} // Fix brace
但是,由於.treeview
元素理論上可能具有0個或多個1個子ul
,因此上述解決方案不夠通用。 我什至建議只捕獲.treeview > a
元素上的點擊,然后您甚至不會遇到這種傳播問題:
for (const link of document.querySelectorAll(".treeview > a")) { link.addEventListener("click", function(e) { this.parentNode.classList.toggle("menu-open"); }); }
.menu-open > ul.treeview-menu { display: block } .treeview > ul { display: none }
<li class="treeview"> <a href="#"> <i class="fa fa-dashboard"></i> <span>Dashboard</span> </a> <ul class="treeview-menu"> <li><a href="#"><i class="fa fa-circle-o"></i> Dashboard v1</a></li> <li class="active"><a href="#"><i class="fa fa-circle-o"></i> Dashboard v2</a></li> </ul> </li>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.